Изменить атрибут на окончательный - PullRequest
0 голосов
/ 11 января 2020

Я хочу инициализировать атрибут, унаследованный подклассом, как финал. Однако, когда я обращаюсь к атрибуту, кажется, меняет , поэтому я предполагаю, что я создал еще один последний атрибут. Можно ли сделать атрибут, упомянутый в суперклассе, конечным атрибутом без создания другого атрибута?

Упрощенный код:

public abstract Superobj {
protected boolean attribute = false;
protected String condition; //A condition to be checked in a subclass
protected String[] collection; //Stores strings
protected int howmany= 0;


public Superobj(int i){
this.collection = new String[i];}

public void insert(String s){
this.collection[howmany] = s;
howmany++;
if (s == condition) {attribute = true;}}  

Я использую другой объект другого класса для передачи аргументов в вставить метод. Конструктор в подклассе инициализирует условие:

public Subclass extends Superclass{
public Sublclass(int i){
super(i);
this.condition = "cond";}}

Однако в одном подклассе я не хочу изменять атрибут - независимо от того, что вставлено в таблицу. Я хочу сделать это окончательным, навсегда ложным, например. Я попытался:

public FinalSubclass extends Superclass {
protected final boolean condition = false; 
...

Однако, когда я проверил значение this.attribute, оно меняется в зависимости от значения переданного аргумента - как если бы был создан еще один this.attribute, противоположный унаследованные. Я не могу добавить в конструктор подкласса что-то вроде:

final this.attribute = false;

Есть ли способ изменить унаследованный атрибут на final? Будет ли исключение, если передать что-то, соответствующее условию, и унаследованный метод попытается изменить атрибут?

1 Ответ

0 голосов
/ 11 января 2020

В соответствии с Java языковой спецификацией переназначение конечных переменных приводит к ошибке времени компиляции . Следовательно, вы не можете «выбрать» переменную, которая будет или не будет final в время выполнения .

Однако, похоже, вам не нужна такая функция.

Если я правильно понимаю вашу цель (я предполагаю, что Superclass является подтипом Superobj), вы хотите изменить значение attribute при вставке всегда в Superobj (и его подклассах), за исключением вставка в FinalSublcass. Таким образом, вы можете просто переопределить метод insert в FinalSublcass таким образом:

@Override
public void insert(String s){
    this.collection[howmany] = s;
    howmany++;
}  

Если вы хотите, чтобы attribute никогда не изменялся в FinalSubclass (не только путем вставки), вы можете сделать поле private в Superobj и создании protected setAttribute(String attribute) setter, который должен быть переопределен в Subclass как-то так:

@Override
protected setAttribute(String attribute) {
    // do nothing or throw exception
}

Но я бы не рекомендовал это из-за нарушения принципа подстановки Лискова (с моей точки зрения вид)

...