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

0
Makusium 19 Май 2019 в 14:08

2 ответа

Лучший ответ

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

Object key;


public void setValue(Object value) {
    if (key != null) {
        // ignore or throw exception, depending on your business logic
    } else {
        key = value;
    } 
}
6
xingbin 19 Май 2019 в 11:19

Нет настоящего способа, кроме использования ключевого слова 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;
    }
}

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

0
ChrisF 19 Май 2019 в 15:21