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
也不应该返回对其自身列表的引用,以防止外部代码修改它。但是,您可以研究在每个级别使用自定义迭代器来完全隐藏列表,而不是返回列表!