2015-03-23 4 views
4

Я прочитал this question о неизменных объектах и ​​был оставлен с вопросом относительно неизменных объектов и конечного поля:Почему переменная экземпляра является окончательной?

Зачем нужна переменная экземпляра в классе неизменяемых быть окончательным?

Для примера рассмотрим этот непреложный класс:

public final class Immutable 

{ 

    private final int someVal; 

    public Immutable(int someVal) 
{ 

    this.someVal= someVal; 
    } 

    public int getVal() { 

    return val; 
} 

} 

Если в приведенном выше коде нет никаких установленных методов и переменная экземпляра устанавливается только внутри конструктора, почему это необходимо, чтобы переменная экземпляра объявлена финал?

+1

снова процитированный вопрос, а не переменные экземпляра должны быть окончательными, но класс. – Henry

+0

Да, я прочитал это, но мой вопрос в том, почему переменные экземпляра в этом классе должны быть окончательными? – Naz

+0

Возможно, это о том, что: ** ** не обязательно быть окончательным, но это ** должно быть окончательным (чтобы однозначно понять, что он не будет изменен). – Marco13

ответ

5

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

Если переменная была public, то вам необходимо будет ее сделать final, чтобы код взаимодействия не мог изменить его значение.

Обратите внимание, что вопрос, который вы связываете, напрямую не связан, поскольку он обсуждает классы, которые являются final, а не переменными. Создание класса final означает, что он не может быть унаследован, а не является неизменным. Разумеется, дело в том, что нужно учитывать содержание этого вопроса и его ответ при создании неизменяемых объектов; но это отдельный вопрос тем не менее.

1

В неизменяемом классе вы не можете изменить состояние его свойства/поля. Как правило, это делается путем не предоставления метода setter клиентскому коду класса.

И сочетание ключевого слова static final используется для создания переменной константы. Заданная переменная переменная никогда не может быть изменена, если она была инициализирована.

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

4

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

Предположим, у вас есть следующий класс:

public class Immutable { 
    private int value; 

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

    public int getValue() { 
     return value; 
    } 
} 

Там нет никакого способа сеттер, поэтому можно легко предположить, что этот класс является неизменяемым. Что это, на данный момент. Но в конце концов, ваш класс будет изменен каким-либо другим программистом, и этот программист может добавить некоторые методы к классу:

public class Immutable { 
    private int value; 

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

    public int getValue() { 
     return value; 
    } 

    public void doSomething() { 
     value++; 
    } 
} 

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

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

+0

Это было хорошее объяснение с точки зрения программирования, например, когда мой код заменяется после некоторых время. – Naz

+0

В вопросе, с которым вы связались, есть очень хороший момент в отношении маркировки вашего класса 'final', который вы должны принять во внимание. – Laf

Смежные вопросы