使用ArrayLists保留Demeter定律

时间:2016-07-29 13:29:04

标签: java arraylist refactoring law-of-demeter

如果我有一个对象的ArrayList,那么每当我需要调用ArrayList成员的任何方法时,我都需要这样做:

list.get(i).doSomething();

这看起来像是德米特法违规。我看不出任何解决方法。这样很好还是我应该重新思考我是如何做这样的事情的。 ArrayList是一个定义为忽略Demeter法则的对象吗?

2 个答案:

答案 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的实例会导致AB之间没有更紧密的联系。

答案 1 :(得分:1)

我真的没有看到违规行为。

Demeter法在概念上提出一个实体只知道它的邻居而不是陌生人,所以如果A需要来自C的内容,它应该与B交谈得到它而不再进一步。

我不会完全称呼List“邻居”来应用这个概念。它是一个操纵数据结构的对象,您可以在整个程序中使用该数据结构。因此,您的列表中包含的Object将被视为B的{​​{1}}。

如果A是您的程序中定义的实际实体,那么在这种情况下您可能是正确的。让List有一个方法要求你的List执行一些逻辑会更有意义(正如你在评论Object中所说的那样)。

如果list.callSomethingOn(i)的这个特定实例是您的程序逻辑的核心,并且您坚持要求满足法律,那么您可以为List使用“装饰器”,这会添加其他方法来处理包含的List s