如果我有一个对象的ArrayList,那么每当我需要调用ArrayList成员的任何方法时,我都需要这样做:
list.get(i).doSomething();
这看起来像是德米特法违规。我看不出任何解决方法。这样很好还是我应该重新思考我是如何做这样的事情的。 ArrayList是一个定义为忽略Demeter法则的对象吗?
答案 0 :(得分:1)
这不是违规行为。
如果你有一个班级
Class A {
private B b1, b2, b3;
...
private void method() {
b1.doSomething();
b2.doSomething();
b3.doSomething();
}
}
没有违规行为。如果我们将B
的实例收集到List<B>
,那么
Class A {
private List<B> listOfB;
...
private void method() {
listOfB.forEach(B::doSomething);
}
}
使用List<B>
来保存B
的实例会导致A
和B
之间没有更紧密的联系。
答案 1 :(得分:1)
我真的没有看到违规行为。
Demeter法在概念上提出一个实体只知道它的邻居而不是陌生人,所以如果A
需要来自C
的内容,它应该与B
交谈得到它而不再进一步。
我不会完全称呼List
“邻居”来应用这个概念。它是一个操纵数据结构的对象,您可以在整个程序中使用该数据结构。因此,您的列表中包含的Object
将被视为B
的{{1}}。
如果A
是您的程序中定义的实际实体,那么在这种情况下您可能是正确的。让List
有一个方法要求你的List
执行一些逻辑会更有意义(正如你在评论Object
中所说的那样)。
如果list.callSomethingOn(i)
的这个特定实例是您的程序逻辑的核心,并且您坚持要求满足法律,那么您可以为List
使用“装饰器”,这会添加其他方法来处理包含的List
s