Можно ли определить переменную только один раз, не используя final - PullRequest
0 голосов
/ 19 мая 2019

Мне было интересно, если в Java есть способ назначить переменную только один раз. Я знаю, что есть последнее ключевое слово, но я хотел бы добиться того же результата без необходимости устанавливать значение в конструкторе. Я хочу установить его вне конструктора, потому что я пока не знаю значения.

Ответы [ 2 ]

6 голосов
/ 19 мая 2019

Вам может потребоваться проверить ключ перед назначением значения, например:

Object key;


public void setValue(Object value) {
    if (key != null) {
        // ignore or throw exception, depending on your business logic
    } else {
        key = value;
    } 
}
0 голосов
/ 19 мая 2019

Нет реального способа, кроме как использовать ключевое слово final.

Вы также должны реализовать пользовательский установщик, который проверяет, было ли уже установлено значение:

public boolean setValue(Object value){
    if( this.value == null){
        this.value = value;
        return true;
    }
    return false;
}

Или вы используете неизменный объект, который оборачивает вышеупомянутое поведение. Существуют разные библиотеки, предоставляющие неизменяемые объекты, или вы пишете одну самостоятельно:

// Constructor based only allows to set the value when constructing the object
public class Immutable{
    private Object value;

    public Immutable(Object value){
        this.value = value;
    }

    public Object getValue(){
        return this.value;
    }
}

// Setter based provides a setValue method which checks, if the value is already set or not
public class Immutable{
    private Object value;

    public boolean setValue(Object value){
        if( this.value == null){
            this.value = value;
            return true;
        }
        return false;
    }

    public Object getValue(){
        return this.value;
    }
}

При переходе к пользовательскому неизменяемому объекту вы также можете использовать универсальные шаблоны, чтобы сделать его более гибким в отношении типа значения.

...