扩展 class 并使变量可变

extending class and making variables volatile

我有这个向量 class:

public class Vector {
    public double x;
    public double y;

    public double getLength() {
        return Math.sqrt(x*x+y*y);
    }
}

大多数时候我只是想按原样使用它,但在某些情况下我想使用它的可变版本,所以我尝试扩展它:

public class VectorVolatile extends Vector {
    public volatile double x;
    public volatile double y;
}

其背后的想法是将原始 class 中的所有功能也用于 volatile class。但这不起作用。变量 (x, y) 不会被正确替换。

我想使用 volatile 因为我有 2 个线程。一个线程读取和写入对象,另一个线程只读。我想使用 volatile 而不是 synchronized,因为我认为它更快,并且由于一个线程只读取,将变量设置为 volatile 应该就足够了。

有没有办法不用复制粘贴就可以得到原版class的所有功能?我不应该使用 volatile 吗?

通过扩展,您没有更改 Vector class.

成员的属性

当您扩展 class 并声明一个同名的新成员时,它将 隐藏 旧成员。也就是说,在 class VectorVolatilethis.xsuper.x 只是两个不同的成员。一种是不稳定的,另一种不是。

https://dzone.com/articles/variable-shadowing-and-hiding-in-java

(恕我直言,通过扩展非线程安全 class 线程安全不是一个好主意)。

一种更简洁的方法可能是为提供 x 和 y 的 class 定义一个接口,让您的方法在该接口上运行,然后为提供 x 和 y 的 class 提供不同的实现。