Java OOP层次结构 - 避免开销

时间:2014-04-11 14:04:12

标签: java class oop hierarchy

我正在使用坐标/向量构建数学库。

有一个ReadableCoordWritableCoord个互动。

AbstractCoordValue可以扩展为覆盖坐标getter。

问题是,不可变coord(AbstractCoordValue)中的方法可以通过两种方式实现,如 VARIANT 1 VARIANT 2

我的DRY胆量告诉我去第一个(然后impl只在一个地方),但我不确定第二个没有更少的开销

使用哪一个?

public abstract class AbstractCoordValue implements ReadableCoord {

    // x(), y(), z() are abstract getters from the interface

    @Override
    public WritableCoord copy()
    {
        return new CoordVariable(x(), y(), z());
    }

    /* VARIANT 1 */
    @Override
    public WritableCoord add(double x, double y, double z)
    {
        return copy().add_ip(x(), y(), z()));
    }

    /* VARIANT 2 */
    @Override
    public WritableCoord add(double x, double y, double z)
    {
        return new CoordVariable(x()+x, y()+y, z()+z));
    }

    // --- snip ---
}

扩展类,可变:

public class CoordVariable extends AbstractCoordValue implements WritableCoord {

    private double x, y, z;

    // implements x(), y(), z() as getters

    public CoordVar(double x, double y, double x) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    @Override // "_ip" stands for "in place"
    public WritableCoord add_ip(double x, double y, double z)
    {
        this.x += x;
        this.y += y;
        this.z += z;

        return this;
    }

    // --- snip ---
}

1 个答案:

答案 0 :(得分:0)

我建议使用实现Readable接口的不可变坐标实现final类,使用实现ReadableWritable接口的可变坐标实现另一个类 - 即避免使用继承,因为扩展了不可变使用mutable的实现违反了LSP(Liskov替换)原则,并且包含了像可变类一样处理可变类的潜在漏洞。