gpt4 book ai didi

java设计: repetitive methods of sub-objects

转载 作者:搜寻专家 更新时间:2023-10-31 20:09:08 24 4
gpt4 key购买 nike

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

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

Country
Capital
Palace
King

如果我现在想从主要对象(国家/地区)在 King 中设置一个私有(private)字符串变量“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 类中,如果这个结构在逻辑上是有意义的,最好的方法是什么?我不确定是否有更好的方法,但我无法摆脱我在这里遗漏了什么的感觉。

最佳答案

这是一个责任问题。

问问自己:“谁负责知道国王是谁?”。当你是皇宫的时候,你对国王负责吗?明显不是。国王不受你的宫殿管理,但他依法律依附于你的国家。

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

正确的做法是获取King实例,并直接设置它的名字。


现在这种方法有一个问题:您可能必须使用许多 getter 才能找到 King 实例。但是您可以使用类的函数式方法解决这个问题。

palace.getOwner()可以通过King implements Owner返回一个接口(interface)Owner

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

关于java设计: repetitive methods of sub-objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42424973/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com