Tag: final

为什么要在Java中声明一个不可变的类final?

我读到,要在Java中创build一个不可变的类 ,我们应该执行以下操作, 不要提供任何setter 将所有字段标记为私有 使课程最终 为什么需要步骤3? 我为什么要把课final标记?

什么时候我们应该使用“公共静态最终string”?

我已经看到了许多代码,人们写public static final String mystring = …然后只是使用一个值。 为什么他们必须这样做? 为什么他们必须在使用前将其初始化为final值? UPDATE 好,感谢所有的答案,我明白这些关键的意义(公共静态决赛)。 我不明白的是为什么人们使用,即使常数只能在一个地方使用,只能在同一个class级使用。 为什么要宣布呢? 为什么我们不使用variables?

在Java中,最终的字段可以从一个构造函数助手初始化?

我有一个最终的非静态成员: private final HashMap<String,String> myMap; 我想用构造函数调用的方法初始化它。 由于myMap是final的,我的“helper”方法无法直接初始化。 当然我有select: 我可以直接在构造函数中实现myMap初始化代码。 MyConstructor (String someThingNecessary) { myMap = new HashMap<String,String>(); myMap.put("blah","blahblah"); // etc… // other initialization stuff unrelated to myMap } 我可以让我的帮助器方法构buildHashMap,将其返回给构造函数,然后让构造函数将对象分配给myMap。 MyConstructor (String someThingNecessary) { myMap = InitializeMyMap(someThingNecessary); // other initialization stuff unrelated to myMap } private HashMap<String,String> InitializeMyMap(String someThingNecessary) { HashMap<String,String> initializedMap = new HashMap<String,String>(); initializedMap.put("blah","blahblah"); […]

声明最终的静态方法是一个坏主意吗?

我明白在这个代码中: class Foo { public static void method() { System.out.println("in Foo"); } } class Bar extends Foo { public static void method() { System.out.println("in Bar"); } } Bar的静态方法隐藏了Foo声明的静态方法,而不是以多态的方式覆盖它。 class Test { public static void main(String[] args) { Foo.method(); Bar.method(); } } …会输出: 在Foo 在酒吧 在Foo中将method()重新定义为final将禁用Bar隐藏它的能力,并重新运行main()将输出: 在Foo 在Foo ( 编辑 :编译失败,当您将方法标记为final ,并且只有当我删除Bar.method() )时再次运行 将静态方法声明为final是否被认为是不好的做法,如果它阻止了有意或无意地重新定义方法的子类? ( 这是对使用final的行为的一个很好的解释。)

在循环内创build最终variables

这是允许在Java中: for(int i=0;i<5;i++){ final int myFinalVariable = i; } 我的问题的关键字是final 。 它允许做一个最终的variables,随着循环的每一个运行而改变吗? 我想知道这是因为final说你不能改变variables的值(只调用myFinalVariable = i ),但是我用final int重新定义了整个variables。 他们是两个完全不同的variables,只是具有相同的名称 – 循环的前一个运行的variables已经走向垃圾收集器的道路?

为什么将类定义为final可以提高JVM的性能?

从http://sites.google.com/site/gson/gson-design-document引用: 为什么Gson中的大多数课程都被标记为final? 虽然Gson通过提供可插入序列化器和反序列化器提供了一个相当可扩展的体系结构,但Gson类并不是专门devise为可扩展的。 提供非最终的类将允许用户合法地扩展Gson类,然后期望该行为在所有后续的修订中都能正常工作。 我们select通过将类标记为final来限制这种使用情况,并等待一个好的用例出现以允许可扩展性。 标记一个类最终还有一个小优点,即为Java编译器和虚拟机提供额外的优化机会。 这是为什么? [如果我猜测:JVM知道类是final的,它不维护方法覆盖表? 还有其他原因吗?] 性能有什么好处? 这是否适用于频率实例化的类(POJO?),或者适用于持有静态方法的类(实用程序类)? 定义为最终的方法在理论上也可以提高性能? 有什么影响吗? 谢谢,Maxim。

“公共静态最终”或“私人静态最终”与getter?

在Java中,教会variables应该保持私有以实现更好的封装,但是静态常量呢? 这个: public static final int FOO = 5; 结果会相当于: private static final int FOO = 5; … public static getFoo() { return FOO; } 但是哪个更好?

在Java中的静态最终关键字

根据教程 : static修饰符与final修饰符一起也用于定义常量。 final修饰符表示这个字段的值不能改变。 只有涉及的types是原始的,我才会同意这一点。 对于引用types,例如一个Point2D类的实例,其位置属性不是final (即,我们可以改变它的位置),这类variables的属性如public static final Point2D A = new Point2D(x,y); 仍然可以改变。 这是真的?

使私有方法最终?

使私人方法最终有益吗? 这会提高性能吗? 我认为“私人决赛”没有什么意义,因为私人的方法不能被推翻。 所以方法查找应该像使用final时一样高效。 如果使用私有帮助器方法是静态的(如果可能的话)会更好吗? 什么是最好的使用? private Result doSomething() private final Result doSomething() private static Result doSomething() private static final Result doSomething()

用try / catch最后一个variables赋值

因为我相信这是一个很好的编程习惯,所以我把所有的(本地或者实例)variables都写成final如果它们只能被写入一次的话。 但是,我注意到,当一个variables赋值可以抛出一个exception,你不能做出最后的variables: final int x; try { x = Integer.parseInt("someinput"); } catch(NumberFormatException e) { x = 42; // Compiler error: The final local variable x may already have been assigned } 有没有办法做到这一点,而不诉诸临时variables? (或者这不是最终修饰符的正确位置?)