Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 非静态最终变量是否在约定中被接受?_Java - Fatal编程技术网

Java 非静态最终变量是否在约定中被接受?

Java 非静态最终变量是否在约定中被接受?,java,Java,这个问题讨论了非静态最终变量的实践 我的问题是(我会很快回答,因为我很忙)在变量上使用最后一个修饰符时,初始化后没有任何东西可以改变它,对吗 假设在一个名为animal的类中有一个值为10的静态最终整数: public static final int SIZE = 10; 这意味着从类型animal创建的所有对象的大小都将为10 何时使用非静态但最终的变量是有用的、实用的或可接受的: public final int SIZE = 10; 这也意味着从类型animal创建的所有对象的大小都

这个问题讨论了非静态最终变量的实践

我的问题是(我会很快回答,因为我很忙)在变量上使用最后一个修饰符时,初始化后没有任何东西可以改变它,对吗

假设在一个名为animal的类中有一个值为10的静态最终整数:

public static final int SIZE = 10;
这意味着从类型animal创建的所有对象的大小都将为10

何时使用非静态但最终的变量是有用的、实用的或可接受的:

public final int SIZE = 10;
这也意味着从类型animal创建的所有对象的大小都将为10


那么,在什么情况下,后者会变得有用呢?因为它的意思基本上是一样的。

当同一只动物有这样一块田地时:

private final Animal mother;
每个人只有一个亲生母亲,没有共享母亲,这意味着每个实例都是特定的


使其
静态
意味着该值在所有实例之间共享。如果这是您想要的,那么它当然有意义。

如果字段类型是不可变的,那么只有当它是由构造函数指定的值时,它才有意义

final class Point {
    final double x, y;
    Point(double x, double y) {
        this.x = x;
        this.y = y;
    }
}
如果字段的值是可变的,那么在其声明站点初始化一个
final
字段是有意义的,因为每个实例将获得自己的引用

final class ListWrapper<A> {
    final List<A> list = new ArrayList<>();
}
final类ListWrapper{
最终列表=新的ArrayList();
}

但在您给出的示例中,不,将字段初始化为
public final int SIZE=10是没有意义的

这方面的一个常见用例是锁定对象

private final Object lock = new Object();
...
synchronized(lock) {...}

这种模式有时要求锁对象属于实例而不是类(<代码> static < /COD>)。java中的

<代码>代码>最终< /代码>不应与C++中的代码> const < /C> >混淆。声明变量
final
意味着无法重新分配该变量。如果变量是基元类型,则可以。如果变量是引用类型,则声明它
final
不会阻止它发生变异

这是安全的(因为
int
是一种基本类型),并且通常被接受:

上课周{
公共静态最终整数天=7;
}
周数/天数=6;//错误:无法重新分配最终变量
这也是安全的。虽然
java.lang.String
不是基本类型,但它保证是不可变的。(即
String
没有改变其值的方法,它永远不能得到一个或一个相当基本的语言级契约将被打破。)我仍然发现许多人不喜欢使用公共属性,许多样式指南禁止使用它

班级工作日{
公共最终字符串名;
公共工作日(字符串名称){
this.name=名称;
}
}
工作日星期一=新的工作日(“星期一”);
周一。name=“周二”//错误:无法重新分配最终变量
这是不安全的:

上课周{
公共静态最终字符串[]周中的天={
“星期一”,
“星期二”,
“星期三”,
“星期四”,
“星期五”,
“星期六”,
“星期日”,
};
}
Week.DAYS OF THE_Week=新字符串[6];//错误:无法重新分配最终变量
周。周中的天[2]=“二月”//这是无法阻止的!

使用
java.util.Collection
不会使最后一个示例变得更好。有
Collection
s截肢了所有的变异方法,但这给我们带来的唯一好处是运行时错误。编译器在这里无能为力。

如果您在ctor中设置它。“在变量上使用最后一个修饰符,初始化后没有任何东西可以更改它,对吗?”——在您的示例中,是的。但是,请注意不要在C++中混淆java中的代码>最终<代码> >代码> const < /Cord>。如果它不是一个基元类型,而是一个携带状态的类,该状态可以通过公共方法更改,那么即使该变量声明为
final
@JClassic,该状态也可以更改如果您内联初始化该变量,那么所有这些变量都具有相同的“母亲”,这没有多大意义,但是,当然:如果你从假设它将是相同的值为每个实例,那么你也可以通过使它成为<代码>静态< /代码>来表示。谢谢,这是我的问题。谢谢:我从来没有处理过C++,但是我猜这个场景没有超出我的脑海。