3

考虑以下示例情况:

public abstract class Parent
{
    private ByteBuffer buffer;

    /* Some default method implementations, interacting with buffer */

    public static Parent allocate(int len)
    {
        // I want to provide a default implementation of this -- something like:
        Parent p = new Parent();
        p.buffer = ByteBuffer.allocate(len);
        return p;
    }
}

public class Child extends Parent
{
    /* ... */
}

public class App
{
    public static void main(String[] args)
    {
        // I want to ultimately do something like:
        Child c = Child.allocate(10);
        // Which would create a new child with its buffer initialized.
    }
}

显然,我不能这样做(new Parent()),因为 Parent 是抽象的,但我真的不想要Parent。我希望这个方法自动提供给子类。

我宁愿使用“静态构造函数”方法,.allocate()而不是添加另一个可见的构造函数。

我有什么方法可以将此默认实现放入Parent类中,还是每个子类都必须包含相同的代码?

我想另一种选择是从父级中剥离“抽象”,但抽象适合——我从不想要父类型的对象。

提前致谢。

4

1 回答 1

5

如果您检查标准 JDK 中的 Buffer 类集合,您会注意到每个特化(ByteBuffer、CharBuffer、DoubleBuffer 等)都allocate定义了自己的静态方法。它们并非都从一个公共基类继承是有原因的——静态方法不是继承的!相反,它们与定义它们的类相关联,并且只能访问类级别的变量。

构建器/工厂模式是您尝试完成的更好的模式。您可以检查 JAX-RSResponse类或DocumentBuilderFactory类以获取有关如何实现这些模式的示例。

于 2013-03-12T05:51:00.380 回答