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

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

Country
  Capital
     Palace
        King

如果现在我想从主对象(国家/地区)在King中设置一个私有(private)String变量'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,财政部,皇后等,该怎么办?这意味着对于子类中的几乎所有方法,Country类中都必须存在一个方法,这可能可能意味着您必须创建大量方法,仅用于将信息传递给子对象,从而导致非常大的Country类。

现在,我想您可以从技术上说国王也可以在国家本身中定义,省去了Palace和Capital中多余的方法,但这仍然意味着方法必须存在于Country类中,如果这种结构有意义,那该怎么办?正如将逻辑分组在一起一样,最好的方法是什么?我不确定是否有更好的方法,但是我无法撼动自己在这里缺少某些东西的感觉。

最佳答案

这是一个责任问题。

问问自己:“谁负责知道国王是谁?”。当您是宫殿时,您要为国王负责吗?很明显不是。国王不受您的宫殿管理,但依法依附于您的国家。

查询palace.setNameOfKing()类似于要求您的房子给您的新生儿起个名字。您的房屋没有这种责任感,因此不应被允许这样做。

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

现在这种方法存在一个问题:您可能必须使用许多getter来查找King实例。但是您可以使用类的功能方法来解决此问题。
palace.getOwner()可以返回带有Owner的接口(interface)King implements Owner

相同的规则可以应用于您的其他类(class)。

10-06 11:04