列出类中的处理

时间:2011-05-26 13:52:44

标签: java

假设我有一个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("");
  }    
}

如果有人能指出任何这些方法的任何优势,将不胜感激。 感谢。

8 个答案:

答案 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类更改其数据结构,则客户端不受影响。