6

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

更多信息:A 类代表雇员,B 类的唯一职责是格式化程序的输出。

4

7 回答 7

6

您是在问是否可以执行以下操作?

public class A {
 private B myB = new B();
 private String myUnformattedName = "some information";

 public String getFormattedInfo() {
   return myB.formatInfo(myUnformattedName);
 }
}

这完全没问题。

将字段标记为私有只是意味着只有包含类应该能够访问它......

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


好的,因此无法在此处设置值,但您可以在此处看到两种不同的调用格式化程序的方法。当参数列表超过三个或四个项目时,就会变得难以阅读。

在这种情况下,我只需将 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

}
于 2013-04-09T10:32:15.970 回答
5

我实际上建议使用访客模式。

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);

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

于 2013-04-09T10:34:51.203 回答
2

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

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

于 2013-04-09T10:30:57.783 回答
1

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

于 2013-04-09T10:30:46.297 回答
1

您可以使 B 类成为实用程序类并仅在其上具有静态方法。

然后在您的 A 类中,您可以拥有以下内容:

公共字符串 formatMyVariables() {

返回 B.format(a,b,c,d);

}

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

于 2013-04-09T10:31:16.583 回答
1

您应该考虑如果您的Employee字段是原始值(int, boolean)或不可变的(String例如),那么您可以让其他类读取它们而不必担心。

保护字段private是不暴露对象内部工作的方法,只能通过其publicAPI 访问。但是,当您的类真正代表一个业务对象(即一组标识实体的值)时,让其他人读取内部字段是完全安全的。

于 2013-04-09T10:31:43.057 回答
-1

传输数据的最佳方式是 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 类,在其实例变量中填充数据,然后将此对象作为参数传递给另一个可以对其进行格式化的类中的方法

于 2013-04-09T10:32:02.200 回答