java - 扩展类并使变量可变

标签 java class volatile extends

我有这个 vector 类:

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

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

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

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

其背后的想法是将原始类中的所有函数也用于 volatile 类。但这行不通。变量 (x, y) 将无法正确替换。

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

有没有一种方法可以从原始类中获取所有函数,而无需复制和粘贴?我不应该使用 volatile 吗?

最佳答案

通过扩展,您没有更改 Vector 类成员的属性。

当您扩展类并以相同名称声明新成员时,它将隐藏旧成员。也就是说,在类 VectorVolatile 中,this.xsuper.x 只是两个不同的成员。一个是不稳定的,另一个则不是。

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

(恕我直言,通过扩展非线程安全类使其成为线程安全并不是一个好主意)。

更简洁的方法可能是为提供 x 和 y 的类定义一个接口(interface),让方法在该接口(interface)上进行操作,然后为提供 x 和 y 的类提供不同的实现。

关于java - 扩展类并使变量可变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60588766/

相关文章:

java - RoadModel.getDistanceOfPath(RoadModel.getShortestPath(Vehicle, Point)) 错误

Java - 对特定主机的第一个 http 请求明显较慢

java - 无法编译已实现接口(interface)的抽象类

c++ - 编译器会折叠结构相同的类吗?

c++ - 从C++中的2个不同线程访问属于同一对象的不同数据成员

java - 我很困惑, volatile 真的有用吗?

java - Spring-boot - 两个相关字段的自定义验证

C++ - 是否可以在没有继承的情况下使用另一个类的方法?

c++ - volatile 在 C++ 的单线程应用程序中有用吗?

c - volatile value-only 语句会触发 C 中的读访问吗?