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通常在创建不可变类型时使用.
他们并不总是聚在一起,这不是一个惯例.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 - 井,类装载机范围,确切地说
最终字段不需要是静态的,有时候有一个非静态的最终实例变量会很有用.标记为static和final的字段通常用于常量,如下所示:
public static final int BORDER_WIDTH = 5;
Run Code Online (Sandbox Code Playgroud)
但是,有时当对象具有不可变属性时,您将看到非静态最终字段.通常,非静态final字段仍然会private出于通常的原因进行标记,因此它更多的是额外检查,因此编译器可以确保您再也不会设置该属性.
| 归档时间: |
|
| 查看次数: |
10048 次 |
| 最近记录: |