【问题标题】:Java OOP hierarchy - avoiding overheadJava OOP 层次结构 - 避免开销
【发布时间】:2014-04-11 14:04:11
【问题描述】:

我正在构建一个带有坐标/向量的数学库。

有一个ReadableCoordWritableCoord 接口。

AbstractCoordValue 可以扩展以覆盖坐标获取器。

问题是,不可变坐标 (AbstractCoordValue) 中的方法可以通过两种方式实现,如这里所示的 VARIANT 1VARIANT 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 ---
}

【问题讨论】:

    标签: java class oop hierarchy


    【解决方案1】:

    我建议使用实现Readable 接口的不可变坐标实现最终类,以及实现ReadableWritable 接口的具有可变坐标的另一个类 - 即避免使用继承,因为使用可变扩展不可变实现违反@987654321 @(Liskov 替换)原则,并包含将可变类视为不可变类的潜在漏洞。

    【讨论】:

    • 好点,但我希望可变的也有所有“在副本中做”的方法。还是这是个坏主意?
    • 不是真的,考虑以其他方式实现add - 例如,使用 sum 创建不可变坐标,而不是创建坐标然后添加一些东西 - 即变体 2。我也应该让你知道我总是喜欢并推荐使用不可变类/变量,因为它们在大多数情况下是线程安全的。
    • 其实你帮了我很大的忙,现在一切都很漂亮而且很容易使用。此外,在链接调用时,不会再有临时坐标造成内存污染。实际上并没有严格按照您的建议进行,因为即。 add() on MutableCoord 返回自身,而 add() on ImmutableCoord 返回一个新的 MutableCoord 和结果。因此,在链接调用时,它会自动切换到可变对象以节省内存。 (而且它是泛型的,所以它都在 javadoc 中。我觉得很酷。也许不是 100% LSP,但对我很有用。)
    猜你喜欢
    • 2010-10-16
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多