расширение класса и превращение переменных в изменчивые - PullRequest
0 голосов
/ 08 марта 2020

У меня есть векторный класс:

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;
}

Идея заключается в том, чтобы использовать все функции, которые есть в исходном классе, также для класса volatile. Но это не работает. Переменные (x, y) не будут заменены правильно.

Я хочу использовать volatile, потому что у меня 2 потока. Один поток читает и пишет в объект, другой только читает. Я хотел бы использовать volatile вместо синхронизированного, потому что я думаю, что это быстрее и поскольку один поток только читает, установки переменных на volatile должно быть достаточно.

Есть ли способ получить все функции из исходного класса? без копирования и вставки? Разве я не должен использовать volatile?

1 Ответ

2 голосов
/ 08 марта 2020

Расширяя, вы не изменяли свойства члена класса Vector.

Когда вы расширяете класс и объявляете нового члена с тем же именем, он будет shadow старый член. То есть в классе VectorVolatile this.x и super.x просто два разных члена. Один является изменчивым, другой - нет.

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

(ИМХО, не стоит делать потокобезопасный класс безопасным для потоков расширяя его).

Более чистым способом может быть определение интерфейса для класса, обеспечивающего x и y, с использованием методов you на этом интерфейсе и последующей реализацией для класса, предоставляющего x и y. *

...