Подтвердить что ты не робот

Должны ли конечные поля класса java всегда быть статическими?

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

4b9b3361

Ответ 1

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

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
}

Ответ 2

Нет, абсолютно нет - и это не конвенция.

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

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

Ответ 3

Они не всегда собираются вместе, и это не конвенция. Поля 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 часто встречается, потому что это означает приложение 1 -wide constant.

1 - ну, класс loader-wide, если быть точным

Ответ 4

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

public static final int BORDER_WIDTH = 5;

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

Ответ 5

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

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

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

Ответ 6

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

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

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

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

Ответ 7

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

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

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