问题标签 [final]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - EventHandler 何时以及为什么要求对象是最终的?
我有来自 GWT 项目的以下代码,它是 onModuleLoad() 方法的一部分(类似于 Java 的 main 方法,如果您不知道 GWT):
为什么这里的两个局部变量必须是 final 的?
java - Java 最终字段值的“最新”保证是否扩展到间接引用?
Java 语言规范在17.5 节中定义了 final 字段的语义:
final 字段的使用模型很简单。在该对象的构造函数中设置对象的最终字段。在对象的构造函数完成之前,不要在另一个线程可以看到它的地方写对正在构造的对象的引用。如果遵循这一点,那么当另一个线程看到该对象时,该线程将始终看到该对象的最终字段的正确构造版本。它还将看到至少与最终字段一样最新的最终字段引用的任何对象或数组的版本。
我的问题是——“最新”保证是否扩展到嵌套数组和嵌套对象的内容?
简而言之:如果一个线程将可变对象图分配给对象中的 final 字段,并且对象图永远不会更新,那么所有线程都可以通过 final 字段安全地读取该对象图吗?
一个示例场景:
- 线程 A 构造 ArrayLists 的 HashMap,然后将 HashMap 分配给类“MyClass”实例中的最终字段“myFinal”
- 线程 B 看到对 MyClass 实例的(非同步)引用并读取“myFinal”,并访问并读取其中一个 ArrayLists 的内容
在这种情况下,线程 B 看到的 ArrayList 的成员是否保证至少与 MyClass 的构造函数完成时一样最新?
我正在寻找对 Java 内存模型和语言规范语义的澄清,而不是像同步这样的替代解决方案。我梦寐以求的答案是肯定或否定,并参考相关文本。
更新:
- 我对 Java 1.5 及更高版本的语义感兴趣,即通过 JSR 133 引入的更新的 Java 内存模型。此更新中引入了对最终字段的“最新”保证。
java - 关于字段的私有静态最终关键字的快速 Java 问题
我声明一个字段:
首先,顺序private static final
重要吗?如果没有,是否有标准的公认顺序或约定?
其次,filename
在我的应用程序中是固定的。这是最好的存储它的价值吗?
java - 为什么使用 final 作为修饰符时此缓存不起作用
我有这段代码可以为这个实例获取一次光标,日志显示它被调用了很多次,尽管我标记为最终的。我错过了什么?
getAllContactsCached 方法应该检索一次列表,第二次应该重用最终对象返回
java - 在 Java 中,可以从构造函数助手初始化最终字段吗?
我有一个最终的非静态成员:
我想使用构造函数调用的方法对其进行初始化。由于 myMap 是最终的,我的“帮助”方法无法直接初始化它。当然我有选择:
我可以直接在构造函数中实现 myMap 初始化代码。
我可以让我的辅助方法构建 HashMap,将其返回给构造函数,然后让构造函数将对象分配给 myMap。
方法 #2 很好,但是,我想知道是否有某种方法可以让辅助方法直接操作 myMap。也许一个修饰符表明它只能由构造函数调用?
java - java序列化如何在未指定默认构造函数时反序列化最终字段?
我有一个类定义了我现在需要序列化的不可变值类型。不变性来自构造函数中设置的最终字段。我试过序列化,它工作(令人惊讶?) - 但我不知道如何。
这是该类的示例
鉴于该类没有无参数构造函数,如何实例化它并设置最终字段?
(顺便说一句 - 我注意到这个类特别是因为 IDEA 没有为这个类生成“无 serialVersionUID”检查警告,但成功地为我刚刚使可序列化的其他类生成了警告。)
java - 为什么我们要在 Java 方法中复制最终实例变量?
例如:
许多 java 类(例如 ArrayBlockingQueue)都遵循这种做法。这有什么好处?
java - Java并发:“级联”变量中的易失性与最终性?
是
一样
如果内部地图被不同的线程访问?
或者甚至需要这样的东西:
如果它不是“级联”映射,最终和 volatile 最终具有相同的效果,即所有线程始终看到映射的正确内容......但是如果映射本身包含映射会发生什么,如示例中所示...如何确保内部 Map 正确“内存屏障”?
坦克!汤姆
java - 最终瞬态字段和序列化
在 Java 中序列化后是否可以将final transient
字段设置为任何非默认值?我的用例是一个缓存变量——这就是为什么它是transient
. 我也有制作Map
不会改变的字段的习惯(即地图的内容改变了,但对象本身保持不变)final
。然而,这些属性似乎是矛盾的——虽然编译器允许这样的组合,但我不能将字段设置为任何东西,除非在反null
序列化之后。
我尝试了以下方法,但没有成功:
- 简单的字段初始化(如示例所示):这是我通常所做的,但在反序列化后似乎没有进行初始化;
- 构造函数中的初始化(我相信这在语义上与上面相同);
readObject()
由于该字段是 ,因此无法在 - 中分配字段final
。
在示例cache
中public
仅用于测试。
输出:
java - 关于 Java 中的局部 final 变量
String
在 java 程序中,参数在方法声明中定义。但在方法定义中,它作为final String
变量访问。是否会导致一些问题(如安全、内存问题)?
例如:
方法声明
方法定义
请帮助我并澄清我的疑问。提前致谢
PS 我将 a 和 b 作为最终变量访问,因为我必须在内部类中使用它。