lok*_*oki 5 java methods subobject
当我在处理我的一个项目并且不得不使用大量嵌套对象时,当我想从上层对象设置一个深层嵌套对象的实例变量时,我变得非常不确定我在Java中的结构设计.感觉我错过了对Java中结构化设计的基本理解.对此有任何见解表示赞赏.
想象一下,我有一个具有嵌套子对象作为变量的逻辑结构的对象.例如:
Country
Capital
Palace
King
Run Code Online (Sandbox Code Playgroud)
如果我现在想要在主对象(Country)中设置King中的私有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;
}
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以打电话了country.setNameOfKing(n);
.现在这很好,如果你只有几个变量,但是如果类King,Palace,Capital各自有许多其他变量和方法定义并且所有这些必须从Country调用.如果Palace还包含其他类对象(现在只是制作东西)怎么办?ThroneRoom,Treasury,Queen等...这意味着对于子类中的几乎所有方法,都必须存在于Country类中,可能意味着你必须创建大量的方法,只是为了将信息传递给子对象,从而产生一个非常大的Country类.
现在我想你可以在技术上说国王也可以在国家中定义,废除宫殿和资本中的额外方法,但它仍然意味着方法必须存在于国家类中,如果这种结构有意义如在逻辑组合在一起,最好的方法是什么?我不确定有更好的方法,但我不能动摇我在这里遗漏的感觉.
这是一个责任问题。
问问自己:“谁有责任知道谁是国王?” 。当你是皇宫的时候,你对国王负责吗?很明显不是。国王不受你们的宫殿管理,但他依法隶属于你们的国家。
查询palace.setNameOfKing()
类似于要求你的房子给你的新生儿起一个名字。你的房子没有这个责任,也不应该被允许这样做。
正确的方法是检索King
实例,并直接设置其名称。
现在这种方法存在一个问题:您可能必须使用许多 getter 来查找实例King
。但是您可以通过类的功能方法来解决这个问题。
palace.getOwner()
可以返回一个Owner
接口King implements Owner
.
相同的规则可以应用于您的其他课程。