Tag: final

由JVM处理`final`

在对这个问题的评论中,我声称在某些情况下final必须得到JVM的尊重。 已经提出了final变量的安全发布 , 静态最终成员的处理也是如此。 但是如何强制执行最终的类和方法并禁止覆盖最终字段呢? 恕我直言,这可以而且必须在上课时间完成。 我的论点是 因为JVM的安全性至关重要,例如String是final ,所以不得加载扩展它的手工制作的类。 同样适用于public final字段。 虽然reflection可以改变它们,但它会在运行时进行检查。 因此,加载时必须拒绝重新分配最终字段的字节码。 但我找不到证据。 我对吗?

常量实用程序类中的最终关键字

在使用具有常量实用程序类的final关键字时,我们可以获得性能和/或任何其他好处的任何差异。 [此类仅包含静态最终字段和私有构造函数以避免对象创建] public class ActionConstants { private ActionConstants() // Prevents instantiation { } public static final String VALIDFIRSTLASTNAME = “[A-Za-z0-9.\\s]+”; public static final String VALIDPHONENUMBER = “\\d{10}”; … … } 只有差异才是最终的阶级 public final class ActionConstants { private ActionConstants() // Prevents instantiation { } public static final String VALIDFIRSTLASTNAME = “[A-Za-z0-9.\\s]+”; public static final String VALIDPHONENUMBER […]

为什么java.util.Scanner类声明为’final’?

我使用Scanner类来读取多个类似的文件。 我想扩展它以确保它们都使用相同的分隔符 ,我还可以添加所有对它们都有效的skipUntilYouFind(String thisHere)等方法。 我可以创建一个包含它们的实用程序类,或者将Scanner类作为变量嵌入到另一个类中,但这更麻烦。 我找到了一些宣布课堂决赛的理由 ,但为什么要在这里完成?

更改最终Integer变量的值

final对象无法更改,但我们可以设置其属性: final MyClass object = new MyClass(); object.setAttr(“something”); //<– OK object = someOtherObject; //<– NOT OK 是否可以对final Integer执行相同的操作并更改其int值? 我问,因为我打电话给工人: public SomeClass myFunction(final String val1, final Integer myInt) { session.doWork(new Work() { @Override public void execute(…) { //Use and change value of myInt here //Using it requires it to be declared final (same reference) } } […]

从内部类访问变量而不是最终的

我怎么能让这个工作: public void onStart() { super.onStart(); int dayN = 0; int i = 0; String day = null; String addFach; String mo1 = null; String mo2 = null; String mo3 = null; String mo4 = null; String mo5 = null; String mo6 = null; String mo7 = null; String mo8 = null; String mo9 = […]

抽象类可以有最终方法吗?

抽象类可以在Java中使用最终方法吗?

Java并发:“级联”变量中的易失性与最终性?

是 final Map<Integer,Map> status = new ConcurrentHashMap<Integer, Map>(); Map<Integer,Map> statusInner = new ConcurrentHashMap<Integer, Map>(); status.put(key,statusInner); 同样的 volatile Map<Integer,Map> status = new ConcurrentHashMap<Integer, Map>(); Map<Integer,Map> statusInner = new ConcurrentHashMap<Integer, Map>(); status.put(key,statusInner); 如果内部Map由不同的线程访问? 或者甚至是这样的要求: volatile Map<Integer,Map> status = new ConcurrentHashMap<Integer, Map>(); volatile Map<Integer,Map> statusInner = new ConcurrentHashMap<Integer, Map>(); status.put(key,statusInner); 如果它不是“级联”映射,则final和volatile最终会产生相同的效果,即所有线程总是看到Map的正确内容……但是如果Map iteself包含一个map,会发生什么?如示例中所示…如何使内部地图正确“内存瘫痪”? 坦克! 汤姆

使用三元运算符和最终变量时出现意外输出

请考虑以下代码段: public static void main(String[] args) { int z1 = 0; final int z2 = 0; System.out.println(false ? z1 : ‘X’); System.out.println(false ? z2 : ‘X’); } 运行此代码时,我希望在您的控制台中看到两个X 但是,实际输出是: 88 X 如果我们看一下关于三元运算符的Java规范 ,我们发现了 如果其中一个操作数是T类型,其中T是byte,short或char,另一个操作数是int类型的常量表达式,其值可以在类型T中表示,那么条件表达式的类型是T. 因此第一个输出将’X’ X’char视为int ,这就是它打印88的原因。 但是,我不确定为什么使用final改变第二个输出的行为。

case表达式必须是static final int的常量表达式?

我有一个final class Ring定义为: final class Ring { public static final int OUT = 3; public static final int MID = 2; public static final int IN = 1; } 我还有一个public class MorrisBoard ,代码如下: public class MorrisBoard { public static final Ring RING = new Ring(); private boolean checkMillBy(int ring, int x, int y) { switch(ring) […]

Java和Final关键字的使用

我是Java新手,已经在Delphi和C#中编程了一段时间。 我的问题涉及当变量声明和实例化都发生在同一方法的范围内时,变量上使用“final”关键字,该变量包含实例化类。 例如 private String getDeviceID() { //get the android device id final TelephonyManager tm = (TelephonyManager)GetBaseContext().getSystemService(Context.TELEPHONY_SERVICE); final String deviceID = tm.getDeviceId(); // log debug message containing device ID Log.d(LOG_CAT, “getDeviceID: ” + deviceID); return deviceID; } 好吧所以我认为我得到的事实是“最终”变量只能被分配一次并且由于每个声明上的“final”关键字而无法更改,但是当方法退出时,两个变量都不会超出范围吗? 并再次调用该方法将简单地重新分配2个新的最终变量,这些变量在方法退出时将再次超出范围? 对我来说,在这些变量上使用“final”关键字似乎有点奇怪? 除非我不理解它们如何影响方法范围内的局部变量? 有人可以告诉我“最终”对方法范围的影响是什么,或者将这些特定变量声明为最终只是某人做的蠢事?