6

当我在做我的一个项目并且不得不使用很多嵌套对象时,当我想从上层对象设置一个深度嵌套对象的实例变量时,我变得非常不确定我在 Java 中的结构设计。感觉就像我错过了对 Java 中结构化设计的基本理解。对此的任何见解都值得赞赏。

想象一下,我有一个对象,它具有将嵌套子对象作为变量的逻辑结构。例如:

Country
  Capital
     Palace
        King

如果我现在想从主对象(国家)在 King 中设置一个私有字符串变量“nameOfKing”,我必须在 King 的所有上层类中定义每个方法。所以是这样的:

public class Country {
   private Capital capital;

   public void setNameOfKing(String n) {
      capital.setNameOfKing(n);
   }
}

public class Capital{
   private Palace palace;

   public void setNameOfKing(String n) {
      palace.setNameOfKing(n);
   }
}

public class Palace{
   private King king;

   public void setNameOfKing(String n) {
      king.setNameOfKing(n);
   }
}

public class King{
   private String nameOfKing;

   public void setNameOfKing(String n) {
      this.nameOfKing = n;
   }
}

这样我就可以打电话了country.setNameOfKing(n);。现在,如果您只有几个变量,这很好,但是如果类 King、Palace、Capital 都定义了许多其他变量和方法,并且所有这些变量和方法都必须从 Country 调用。如果 Palace 还包含其他类对象,例如(现在只是编造一些东西)ThroneRoom、Treasury、Queen 等会怎么样...这意味着对于子类中的几乎所有方法,Country 类中都必须存在一个,这可能可能意味着您必须创建大量方法来将信息传递给子对象,从而导致非常大的 Country 类。

现在我想你可以从技术上说 King 也可以在 Country 本身中定义,取消 Palace 和 Capital 中的额外方法,但这仍然意味着方法必须存在于 Country 类中,如果这种结构有意义怎么办就像逻辑组合在一起一样,最好的方法是什么?我不确定有没有更好的方法,但我无法摆脱我在这里错过了什么的感觉。

4

1 回答 1

4

这是一个责任问题。

问问自己:“谁负责知道谁是国王?” . 当你是一个宫殿,你对国王负责吗?显然不是。国王不在你的宫殿管理,但他依附于你的国家。

查询palace.setNameOfKing()类似于要求你的房子给你的新生儿起个名字。你家没有这个责任,也不应该被允许这样做。

正确的做法是检索King实例,并直接设置其名称。


现在这种方法存在一个问题:您可能必须使用许多 getter 来查找King实例。但是您可以使用类的功能方法来解决这个问题。

palace.getOwner()可以返回一个接口OwnerKing implements Owner

相同的规则可以应用于您的其他课程。

于 2017-02-23T20:26:24.060 回答