2013-02-16 3 views
17

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

ответ

35

Конечно нет. Они должны быть статическими, если они принадлежат к классу, а не быть статическим, если они принадлежат к экземпляру класса:

public class ImmutablePerson { 
    private static final int MAX_LAST_NAME_LENGTH = 255; // belongs to the type 
    private final String firstName; // belongs to the instance 
    private final String lastName; // belongs to the instance 

    public ImmutablePerson(String firstName, String lastName) { 
     if (lastName.length() > MAX_LAST_NAME_LENGTH) { 
      throw new IllegalArgumentException("last name too large"); 
     } 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    // getters omitted for brevity 
} 
4

Если вы хотите получить к ним доступ, как ClassName.FIELD, то да, вы должны это сделать. Если вы не станете им статичным, вы должны сделать что-то вроде new ClassName().FIELD, что необязательно и бессмысленное создание объекта.

Однако, если вы используете его только в классе или делаете его private, то не делайте его статичным. Если вы находитесь в самом классе, вы можете просто сделать FIELD.

Чтобы полностью понять эту концепцию, вы должны знать, что означает static. Статический означает, что он принадлежит к фактическому классу, а не к экземпляру.

2

Абсолютно нет. Неизменяемые объекты, например, имеют свойства final, которые могут быть установлены только один раз конструктором.

Для получения дополнительной информации, пожалуйста, см: http://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html

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

7

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

class Person { 

    private final String name; 
    private final int age; 

    public Person(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 

    public String getName() { 
     return name; 
    } 

    public int getAge() { 
     return age; 
    } 

} 

С другой стороны static но не final поля не так распространены и довольно сложно. static final часто виден, потому что это означает приложение -constant.

1 - хорошо, загрузчик классов шириной, чтобы быть точным

20

Нет, совсем нет, - и это не условность.

static и finalполностью разные вещи. static означает, что поле относится к типа, а не к любому конкретному экземпляру типа. final означает, что поле не может изменить значение после первоначального присвоения (которое должно происходить во время инициализации типа/экземпляра).

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

7

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

public static final int BORDER_WIDTH = 5; 

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

+0

Это не только дополнительную проверку. Заключительные поля предоставляют дополнительные гарантии безопасности потоков. –

3

Абсолютно нет. Рассмотрим:

class Point { 
    public final int x; 
    public final int y; 

    public Point(int _x, int _y) { 
     x = _x; 
     y = _y; 
    } 
} 

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

1

Ответ отрицательный.

статическая

  • «Указывает, что только одно такое поле данных доступно для всех экземпляров этого класса. Без этого модификатора, каждый экземпляр имеет свой собственную копию поля данных»

    ... это означает, что может быть только один из этой

окончательный

  • "Значение, указанное в поле данных не может быть изменен"

    ... что означает, что это постоянная

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