2015-04-27 4 views
1

Должны ли поля класса Java всегда быть окончательными? Это хорошая практика?Должны ли поля класса Java всегда быть окончательными? Это хорошая оценка?

Я знаю, что означает «final» для примитива или типа объекта. Мой вопрос в том, должен ли я часто (или всегда) использовать поля с окончательным?

например.

public class MemoryUsage { 
    private final long init; 
    private final long used; 
    private final long committed; 
    private final long max; 

    /** 
    * Constructs a <tt>MemoryUsage</tt> object. 
    * 
    * @param init  the initial amount of memory in bytes that 
    *     the Java virtual machine allocates; 
    *     or <tt>-1</tt> if undefined. 
    * @param used  the amount of used memory in bytes. 
    * @param committed the amount of committed memory in bytes. 
    * @param max  the maximum amount of memory in bytes that 
    *     can be used; or <tt>-1</tt> if undefined. 
    * 
    * @throws IllegalArgumentException if 
    * <ul> 
    * <li> the value of <tt>init</tt> or <tt>max</tt> is negative 
    *  but not <tt>-1</tt>; or</li> 
    * <li> the value of <tt>used</tt> or <tt>committed</tt> is negative; 
    *  or</li> 
    * <li> <tt>used</tt> is greater than the value of <tt>committed</tt>; 
    *  or</li> 
    * <li> <tt>committed</tt> is greater than the value of <tt>max</tt> 
    *  <tt>max</tt> if defined.</li> 
    * </ul> 
    */ 
+0

Короткий ответ: нет. Длинный ответ: прочитайте документы на 'final'. – Mena

+0

Возможный дубликат [Когда следует использовать final для параметров метода и локальных переменных?] (Http://stackoverflow.com/questions/154314/when-should-one-use-final-for-method-parameters-and-local -переменные) – Unihedron

+0

@Unihedron Как на самом деле это дубликат? OP спрашивает о полях класса. Этот вопрос касается параметров метода и локальных переменных. –

ответ

2

Просто краткий пример, допустим, у вас есть класс «Студент». У вас есть поле 'birthDate'.

Теперь это поле может быть окончательным, поскольку можно с уверенностью предположить, что если вчера дата вашего рождения была 20-го января 1980 года, это будет еще в следующем году.

Но, если у вас есть поле:

private String major; 

Это не должно быть окончательным. Вы бы сделали невозможным для студента изменить майоры, что часто случается.

Итак, для примитивного типа: значение никогда не изменится во время всего потока вашего приложения/времени жизни объекта, тогда оно может (но не обязательно) окончательным.

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

Но, нет. Далеко не все переменные должны быть окончательными.

0

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

+3

Для примитивов это означает, что вы не можете изменить значения, для объектов это означает, что вы не можете повторно ссылаться на них. Не обязательно то же самое. – Stultuske

+0

они не просто не обязательно одинаковы, они совершенно разные, спасибо, что указали это! – svarog

0

В дополнение к другим ответам:

Если вы сделаете все поля объекта окончательный, а также обеспечить, чтобы ссылочный объект имел те же ограничения, что и вы создаете Immutable Object с его собственными преимуществами (например, безопасность потоков, нет side effects) и недостатки (вы должны использовать copy on write, никаких побочных эффектов).

Примером этого дизайна является пакет java.time.

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