java类的最终字段是否应该是静态的?

Kar*_*k S 18 java static final

我在网上找不到任何关于此的参考资料.但只是想知道一个类中的最终字段是否应该总是static或者只是一个约定.基于我对它们的用途的理解,我觉得做的事情比语言强加的更合乎逻辑.

JB *_*zet 37

当然不是.如果它们属于类,则它们必须是静态的,如果它们属于类的实例,则它们不是静态的:

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
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 21

不,绝对不 - 而且这不是一个惯例.

static并且final完全不同的事情.static表示该字段与类型相关,而不是与该类型的任何特定实例相关.final表示该字段在初始分配后不能更改值(必须在类型/实例初始化期间发生).

static final字段通常用于常量 - 而实例字段final通常在创建不可变类型时使用.


Tom*_*icz 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

另一方面static但不是final字段并不常见,而且非常棘手.static final经常被看到,因为它意味着应用程序1- wide常量.

1 - 井,类装载机范围,确切地说


Ale*_*ing 7

最终字段不需要是静态的,有时候有一个非静态的最终实例变量会很有用.标记为static和final的字段通常用于常量,如下所示:

public static final int BORDER_WIDTH = 5;
Run Code Online (Sandbox Code Playgroud)

但是,有时当对象具有不可变属性时,您将看到非静态最终字段.通常,非静态final字段仍然会private出于通常的原因进行标记,因此它更多的是额外检查,因此编译器可以确保您再也不会设置该属性.