【发布时间】:2013-03-23 10:06:47
【问题描述】:
我有一个实现接口的类。还有另一个类也实现了这个接口,第二个类的一个实例支持我的类的实现。
对于接口指定的许多方法,我的类只是将它们直接转发给第二个类。
public class MyClass implements MyInterface
{
private OtherClass otherClassInstance; // Also implements MyInterface.
// ...
void foo() { otherClassInstance.foo(); }
void bar() { otherClassInstance.bar(); }
void baz() { otherClassInstance.baz(); }
// ...
}
简单地从第二个类派生我的类将消除所有这些,但这没有意义,因为这两个类彼此无关(除了实现一个公共接口之外)。它们代表不同的东西——碰巧我的很多类的实现都复制了另一个类的实现。换句话说,我的类是在第二类之上实现的,但它本身并不是第二类的子集。我们知道,继承是为了表达“is-a”关系,而不是共享实现,所以在这种情况下是不合适的。
This Joshua Bloch 的一段谈话很好地说明了这种情况。
我知道 Java 对委派没有任何语言支持。但是,是否至少有某种方法可以清理我的类的实现,使其不那么多余?
【问题讨论】:
-
让我直截了当地说...您想扩展 ArrayList,但并非在所有情况下,界面都不会削减它...如果您的
MyList主要归结为 ArrayList,那么它会扩展 ArrayList 并相应地处理非 arraylist 列表真的很有意义。 -
通常我会检查“MyList”的原因。大多数时候,它是一个 ArrayList,在某些情况下我需要特殊的行为。对于这种情况,我使用 ArrayList 并构建 Wrapper/Adapter/commands 来提供功能。而且大部分时间我都会查找 Guava,并免费获得所需的扩展。
-
@Shark 不,我不想扩展
ArrayList。我正在创建自己的类来实现List,而ArrayList成员只是支持我的实现。使用MyList对象代替ArrayList对象确实不有意义 - 永远。 -
“每个 MyList 都不是 ArrayList。它们代表不同的东西。MyList 恰好复制了 ArrayList 的大部分实现。”对我来说,这就是 ArrayList 子对象的定义:它覆盖了一些方法,但它们中的大多数是相等的。
-
你知道你需要什么以及为什么要这样做 Maxpm,所以也许你应该解释为什么扩展
ArrayList是一个错误的举动?此外,谁会使用你的MyList而不是ArrayList?
标签: java oop delegation boilerplate