Java 实现封装的正确方法

Java 实现封装的正确方法,java,java-8,Java,Java 8,我有以下课程计划 国家拥有地区的阵列列表,地区拥有地区的阵列列表,以及地区拥有个人的阵列列表 因此,我有以下问题: 1) 我可以通过国家和地区“推”一个人,将其添加到该地区吗 例如: National national = new National(); .... national.addPerson(person); // Every level has his own addPerson method Zone zone = new Zone(); ... zone.getPersons

我有以下课程计划

国家
拥有
地区
阵列列表
地区
拥有
地区
阵列列表
,以及
地区
拥有
个人
阵列列表

因此,我有以下问题:

1) 我可以通过国家和地区“推”一个人,将其添加到该地区吗

例如:

National national = new National();
....
national.addPerson(person); // Every level has his own addPerson method
Zone zone = new Zone();
...
zone.getPersons(); //Return a ArrayList with the persons of every Region in Zone.

在OOP中,正确的方法是什么

2) a是否可以创建一种方法,让我返回某个级别中的每个人

我的意思是,例如:

National national = new National();
....
national.addPerson(person); // Every level has his own addPerson method
Zone zone = new Zone();
...
zone.getPersons(); //Return a ArrayList with the persons of every Region in Zone.
这不利于封装

3) 每个级别都有一个next()、hasNext()、first()方法,因此我可以在该特定级别进行迭代

就这些。一般来说,我得到了封装和OOP,但我不知道什么是正确的,什么是错误的


谢谢。

根据您的类图,
个人
必须始终是
地区
的成员,也就是说,
国家
区域
不能直接包含其下
地区
中未包含的
个人
对象

在这种情况下,匹配签名的方法
addPerson(Person p)
只能出现在
区域中。正如你所说的,那么你必须这样做

national.getZone(i).getRegion(j).addPerson(person);
没有逻辑上的理由,比如说

National#addPerson(Person p)
因为
国家
没有关于此人所属的
地区和
地区的信息

但是,您可以在
国家
区域
中添加方便的方法,即您所说的“推倒”一个人,但前提是您提供必要的数据

National#addPerson(ZoneId zid, RegionId rid, person) { ...
对于
ZoneId
RegionId
替换在
国家范围内查找分区和区域时使用的任何键类型

Zone#AddPerson(RegionId rid, person) { ...
如上所述的
区域ID

这只是一个开始,您必须考虑一些问题,例如在
addPerson(…)
调用中找不到
ZoneId
和/或
RegionId
时会发生什么。在这种设计中,唯一可行的选择是抛出异常,因为此时您没有足够的信息来实例化
区域
区域

编辑:


如果如您在注释中所述,
Person
对象包含足够的信息来标识
区域
区域
,则您在
国家
区域
中的便利方法可以执行所需的查找,并将其委托给链中的下一个
addPerson(Person p)

堆栈溢出不是解决此问题的地方。在@ProgyadeepMoulik上搜索一个适合这个问题的网站,我相信这是主题。@ProgyadeepMoulik为什么不是地方?先生,关于封装,我还可以问什么地方?@ProgyadeepMoulik您在该网站上的时间还不够长,无法很好地了解主题。我建议你暂时不要做出那样的判断。只是觉得这是离题了。我收回我的评论。我错过了一件重要的事情,Person类,它有关于他所属地区的信息,在这种情况下,National#addPerson(Person p)是有效的吗。一个人也可以成为Zone和National的成员(也是一个集合)?(所以每个人都必须加入国家、地区和地区)这是OOP范式的突破?好的,谢谢!还有,我帖子的另一部分。链中每个级别的下一个方法是否有效?或者必须是类的委托,实际包含Person类的是什么?。在每个级别上都可以使用
getPersons()
方法,但它应该返回一个新列表,而不是对内部维护的列表的引用。它必须为
国家
区域
级别执行此操作,因为它必须合并多个列表。但即使是
Region
也不应该返回对其自身列表的引用,以防止外部代码修改它。但是,您可以研究在每个级别使用自定义迭代器来完全隐藏列表,而不是返回列表!