2011-05-26 20 views
3

内处理比方说,我有一个具有相关元素的列表(元素的类型无关)A类:列表类

public class A { 
    private List<String> list; 

    public List<String> getList() { 
    return list; 
    } 

    public void addElement(String element) { 
    list.add(element); 
    } 
} 

现在我想从另一个类访问此列表,客户端。我需要添加一个新元素。这个问题,更具有哲学意义的是,从设计的角度来看,这是如何做到最好的。

public class Client { 
    private A a = new A(); 

    public void method1() { 
    a.getList().add(""); 
    } 

    public void method2() { 
    a.addElement(""); 
    }  
} 

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

回答

9

通常您的getList()方法被认为是不好的风格。如果类A返回对其实际List的引用,则调用者可能会在该列表上调用clear(),或向其添加一百万个元素,或者如此知道谁知道。使用Collections.unmodifiableList()只返回IteratorList只读视图是一个好主意。

这意味着你的解决方案2,addElement()是更好的; addElement()方法可能包含代码来验证添加的元素,限制列表的大小或其他。而clear()将无法​​访问。

+0

是的,这主要是我在想什么。从列表的只读视角来看,尽管我的观点很好。 – Deelazee 2011-05-26 14:02:30

1

我不会允许访问列表(即getList()),但是您添加了addElement方法。这是一个好主意,因为您可以对该方法中可以添加到列表的内容施加限制。

0

编码时,应考虑维护过程。班级对彼此的了解越少,它就越好。
客户应该只知道A可以有元素....所以我会认为第二个设计更好。

1

我会选择

public void method2() { 
    a.addElement(""); 
} 

因为mantains隐藏在里面A列表。当然,这取决于如果A列表中只有A的实例应该得到对列表的引用,那么这个列表与A的相关程度如何,那么这是我的选择。
另一个原因可能是放弃列表可能会导致客户移除物品,您可能希望避免客户将列表视为自己的物品,这是A的,请保管好它! :P

否则该列表不属于A,应从中删除。

5

如果你的意图是真正暴露这个列表,method2通常是一个更好的OOP风格。 (由于使用method2你会得到addAll等是免费的。)的标准API在这种模式的

例子:

文件应该照顾说一些像该对象是由返回的集合支持,所以修改将...


的缺点是,通过公开名单你允许客户做remove等,所以如果你的目的是要只是通过add收集物品,然后method1可能仍然是一个更好的选择。标准的API在这个模式的

例子:

1

你最应该隐藏在A类A中的基础列表不应该提供一个getList()方法,如果可能。

B类应专门使用a.addElement()。而且,如果B需要从A中的列表中读取,则A应该提供访问列表的方法,而不是给出B的整个列表。

面向对象编程的主要租户之一是Encapsulation。这意味着你应该隐藏你的类的底层实现,并抽象出低级信息。

对于你的具体问题,你会想要使用method2()。如果您遵循适当的面向对象原则,您甚至不应该使用B中的a.getList()

0

您应该提供一种在A类上添加元素的方法。从设计角度来看,原始List错误是错误的,因为您的类的用户可以完全访问它。

0

method2更好,因为客户端不需要打扰列表实现。如果A类更改其数据结构,则客户端不受影响。