代码之家  ›  专栏  ›  技术社区  ›  false_azure

Java-有一个方法可以将私有字段值传递到另一个类的方法中吗?

  •  6
  • false_azure  · 技术社区  · 11 年前

    我有一个类,它有一堆字段,都是私有的(子类使用受保护的getter访问一些字段)。我需要将这些字段中的大部分传递到另一个类中的方法中,该方法将对它们进行格式化并生成输出。在类中有一个带有字段的方法可以传递所有字段吗?或者,这些情况是否表明我应该在这两个类之间实现一些其他关系,因为它们似乎因此而紧密耦合?

    进一步信息:A类代表员工,B类的唯一责任是格式化程序的输出。

    7 回复  |  直到 11 年前
        1
  •  6
  •   Paul D'Ambra    11 年前

    你在问做以下事情是否可以吗?

    public class A {
     private B myB = new B();
     private String myUnformattedName = "some information";
    
     public String getFormattedInfo() {
       return myB.formatInfo(myUnformattedName);
     }
    }
    

    完全可以。

    Marking a field as private just means that only the containing class should be able to access it...

    如果你的意思是别的,最好在你的问题中弹出一些代码,给人们提供上下文


    好吧,这里没有设置值的方法,但您可以在这里看到调用格式化程序的两种不同方法。当参数列表超过三项或四项时,就很难阅读了。

    在这种情况下,我只需将A传递到格式化程序中,并为您希望B能够读取的每个值提供一个get方法。

    public class A {
     private B myB = new B();
     private String myUnformattedName = "some information";
     private String myUnformattedNameOne = "some information";
     private String myUnformattedNameTwo = "some information";
     private String myUnformattedNameThree = "some information";
     private String myUnformattedNameFour = "some information";
     private String myUnformattedNameFive = "some information";
     private String myUnformattedNameSix = "some information";
    
     public String getFormattedInfo() {
       //pass the object itself and use get methods
       return myB.formatInfo(this); 
     }
    
     public String getFormattedInfoLong() {
       //this is OK but gets difficult to read the longer the 
       //parameter list gets
       return myB.formatInfo(myUnformattedName, myUnformattedNameOne, 
          myUnformattedTwo, myUnformattedNameThree, myUnformattedNameFour,
          myUnformattedNameFive, myUnformattedNameSix); 
     }
    
     //getters
     public String getUnformattedName() {
        return myUnformattedName;
     }
    
     public String getUnformattedNameOne() {
        return myUnformattedNameOne;
     }
    
     //etc
    
    }
    
        2
  •  5
  •   Simon Hellinger    11 年前

    实际上,我建议采用访问者模式。

    类A有一个接受访问者的方法,访问者又有一个定义良好的公共方法,例如:

    首先,被访问的类允许一些具有良好定义的接口的类进入,而不将自己的数据传递给外部。

    public class A {
        int data;
    
        public void getFormattedBy(Formatter f) {
           f.format(data);
        }
    }
    

    访问者的接口,允许使用多个格式化程序

    public interface Formatter {
        void format (int data);
    }
    

    一个格式化程序,它被允许进入被访问的类。

    public class B implements Formatter {
        public void format(int data) {
            // do the formatting and printing
        }
    }
    

    这样你就可以简单地打电话

    A a = new A();
    B b = new B(); // the formatter
    a.getFormattedBy(b);
    

    最后,访问者(格式化程序)可以访问许多允许访问者进入的类(可能是通过自己实现接口),并且一个被访问的类可以被许多访问者访问。

        3
  •  2
  •   NPE    11 年前

    我认为传递它们是完全可以的,只要它们要么是原始类型,要么是不可变的。

    如果被调用者可以在不应该修改的时候修改它们,那么就有了设计问题。

        4
  •  1
  •   MiloÅ¡ Lukačka    11 年前

    只要B类不修改它们就可以了。如果类确实这样做了,那么将不可变的实例传递给它。

        5
  •  1
  •   user2203056 user2203056    11 年前

    您可以使类B成为一个实用程序类,并且只在它上面有静态方法。

    然后在你的A班里,你可以有这样的东西:

    公共字符串格式MyVariables(){

    返回B格式(a、B、c、d);

    }

    我假设您提到的输出是一个字符串,但它实际上可以是任何东西。

        6
  •  1
  •   Raffaele    11 年前

    你应该考虑,如果你 Employee 字段是基元值( int , boolean )或不可变的(如 String 例如),然后您可以让其他类阅读它们而不必担心。

    使用保护字段 private 是不公开对象的内部工作的方法,只能通过其 public API然而,当您的类真正代表一个业务对象(即标识实体的一组值)时,让其他人读取内部字段是完全安全的。

        7
  •  -1
  •   Nomesh Gajare    11 年前

    传输数据的最佳方式是DTO对象。

    这些对象只包含实例变量(带有setter和getter)作为要传输的数据!

    这个班不应该有任何行为

    例如,如果要传递Employee数据,请执行以下操作

    class EmployeeBean
    {
    private String name;
    private String age;
    
    public void setName(String n)
    {
    name=n;
    }
    
    public String getName()
    {
    return name;
    }
    
    
    public void setAge(int n)
    {
    age=n;
    }
    
    public int getAge()
    {
    return age;
    }
    
    }
    

    现在可以创建EmployeeBean类,在其实例变量中填充数据,然后将此对象作为参数传递给另一个类中的方法,在该类中可以对其进行格式化