假设我有一个A类,它有一个相关元素列表(元素类型不相关):
public class A {
private List<String> list;
public List<String> getList() {
return list;
}
public void addElement(String element) {
list.add(element);
}
}
现在我希望从另一个类Client访问此列表。我需要添加一个新元素。问题是一个更具哲学意义的问题,就是从设计的角度来看这是多么好。
public class Client {
private A a = new A();
public void method1() {
a.getList().add("");
}
public void method2() {
a.addElement("");
}
}
如果有人能指出任何这些方法的任何优势,将不胜感激。 感谢。
答案 0 :(得分:9)
通常,您的getList()
方法被视为不良风格。如果类A
返回对其实际List
的引用,则调用方可能会在该列表上调用clear()
,或者向其添加一百万个元素,或者知道什么是全部。最好只使用Iterator
返回List
,或仅返回Collections.unmodifiableList()
的只读视图。
这意味着您的解决方案2,addElement()
更好; addElement()
方法可能包含验证添加元素,限制列表大小等的代码。 <{1}}将无法访问。
答案 1 :(得分:5)
如果您打算真正公开列表,method2
通常是更好的OOP风格。 (由于使用method2
,您将免费获得addAll
等。)
标准API中此模式的示例:
文档应该注意说像这个对象由返回的集合支持,因此修改将...
缺点是,通过公开列表,您允许客户端remove
等等,所以如果您打算通过add
收集项目,那么{{ 1}}可能仍然是一个更好的选择。
标准API中此模式的示例:
答案 2 :(得分:1)
我不会授予对列表(即getList())的访问权限,但是你添加了一个addElement方法。这是一个好主意,因为您可以对该方法中可以添加到列表中的内容进行限制。
答案 3 :(得分:1)
我会选择
public void method2() {
a.addElement("");
}
因为mantains隐藏了A
内的列表。当然,这取决于A
的列表与A
的列表的相关程度,如果只有A
的实例应该获得对列表的引用,那么这是我的选择。
另一个原因可能是放弃列表可能导致客户删除项目,您可能希望避免客户将列表视为自己的列表,它是A
的,保持安全! :P
否则该列表不属于{{1}},应从中删除。
答案 4 :(得分:1)
你绝对应该隐藏A类中的基础列表。如果可能的话,不应该提供getList()
方法。
B类应该专门使用a.addElement()
。并且,如果B需要从A中的列表中读取,A应该提供访问列表的方法,而不是给B整个列表。
OO编程的主要租户之一是Encapsulation。这意味着您应该隐藏类的底层实现,并抽象出低级信息。
根据您的具体问题,您需要使用method2()
。如果您遵循适当的OO原则,您甚至不能使用课程a.getList()
中的B
。
答案 5 :(得分:0)
编码时,应考虑维护过程。班级对彼此的了解越少,它就越好。
客户应该只知道A可以有元素....所以我会认为第二个设计要好得多。
答案 6 :(得分:0)
您应该提供一种在类A上添加元素的方法。从设计的角度来看,返回原始的List
是错误的,因为您的类的用户具有对它的完全访问权。
答案 7 :(得分:0)
方法2更好,因为客户端不需要打扰列表实现。如果A类更改其数据结构,则客户端不受影响。