Tag: final

在java中将对象声明为final

有人可以澄清下面代码的重要性。 class A { int i = 10; public void setI(int b) { i = b; } public int getI() { return i; } } class Test { public static void main(String args[]) throws Throwable { final A ob = new A(); ob.setI(10); System.out.println(ob.getI()); } } 对象A被声明为final,但我可以更改此对象的实例变量的值,并还可以检索更新的值。 那么将对象声明为final是什么意义。 我知道将原始数据类型声明为final,这使得该变量不变。

双重检查锁定没有波动

我读到了关于如何进行双重检查锁定的问题: // Double-check idiom for lazy initialization of instance fields private volatile FieldType field; FieldType getField() { FieldType result = field; if (result == null) { // First check (no locking) synchronized(this) { result = field; if (result == null) // Second check (with locking) field = result = computeFieldValue(); } } return result; } […]

Java 8 Lambda问题在递增计数时有效最终

我想在以下场景中使用Java 8 Lambda表达式,但我得到的是在封闭范围内定义的局部变量fooCount必须是final或者有效的final 。 我理解错误信息的内容,但我需要在这里计算百分比,所以需要增加fooCount和barCount然后计算百分比。 那么实现它的方法是什么: // key is a String with values like “FOO;SomethinElse” and value is Long final Map map = null; …. private int calculateFooPercentage() { long fooCount = 0L; long barCount = 0L; map.forEach((k, v) -> { if (k.contains(“FOO”)) { fooCount++; } else { barCount++; } }); final int fooPercentage = […]

错误:参数的非法修饰符

我正在使用这些代码行…… public static final int WIDTH = 240; public static final int HEIGHT = 350; public static final int SCALE = 2; 但我总是遇到这些错误…… Illegal modifier for parameter WIDTH; only final is permitted Illegal modifier for parameter HEIGHT; only final is permitted Illegal modifier for parameter SCALE; only final is permitted

最终String s =“Hello World”与String s =“Hello World”相同吗?

如果一个类被定义为final ,我们声明一个最终类的实例……它会有什么不同吗? 或者在这种情况下是final是多余的? final String s = “Hello World” 与…一样 String s = “Hello World”

局部变量需要声明为final

我收到错误“从内部类中访问本地变量框;需要声明为final”。 这似乎没问题,但我不认为这是最好的解决方案,所以我希望也许别人可以帮助我。 这是我的代码: public void showPublisherBox(JComboBox box) { if (publisherBox == null) { publisherBox = new AddPublisherForm(); publisherBox.setLocationRelativeTo(this); } publisherBox.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent we) { this.populatePublishers(box); } private void populatePublishers(JComboBox box){ box.setModel(db.getPublishers()); } }); publisherBox.setVisible(true); } Publisher表单只是一个新的JFrame,它打开并接收一些信息,当它关闭时,我希望通过从我的db.getPublishers()方法设置模型来重新填充JComboBox。 那么有更好的方法来做我在这里做的事情,还是我必须宣布一些事情是最终的? 谢谢

当无法分配变量时,可能已经分配了变量

研究这段代码: public class TestFinalAndCatch { private final int i; TestFinalAndCatch(String[] args) { try { i = method1(); } catch (IOException ex) { i = 0; // error: variable i might already have been assigned } } static int method1() throws IOException { return 1; } } 编译器说java: variable i might already have been assigned了java: variable […]

在Java中初始化最终变量的问题

我一直在努力解决Java中的一个问题并开始找到我,我无法想到一个合适的方法来解决它。 我有一个最终的对象属性,但是动态。 也就是说,我希望值在指定后保持不变,但每个运行时的值可以不同。 所以我在课程开头声明了类级别变量 – 比如private final FILE_NAME; 。 然后,在构造函数中,我为它赋值 – 比如说FILE_NAME = buildFileName(); 当我在buildFileName()方法中抛出exception的代码时,问题就开始了。 所以我在构造函数中尝试这样的东西: try{ FILE_NAME = buildFileName(); } catch(Exception e){ … System.exit(1); } 现在我有一个错误 – “空白的最终字段FILE_NAME可能尚未初始化。” 这是我开始对Java严格的编译器感到有些恼火的地方。 我知道这不会是一个问题,因为如果它到达catch,程序将退出…但编译器不知道,因此不允许此代码。 如果我尝试在catch中添加一个虚拟赋值,我会得到 – “可能已经分配了最终字段FILE_NAME。” 我显然不能在try-catch之前分配一个默认值,因为我只能分配一次。 有任何想法吗…?

Java构建时间常量配置

我有一个项目,我想使用多种配置构建。 我有一个常量,需要在构建之间有所不同,但我不知道如何根据我的配置更改它。 例如,我希望能够基于配置文件中的值来执行以下操作。 @WebService(targetNamespace = “http://example.com/”) public class CustomerWebService { 和 @WebService(targetNamespace = “http://demo.example.com/”) public class CustomerWebService { 我们用ant来建造。

Java中静态和非静态最终基元字段之间的性能差异

我最近遇到了一个声明了以下字段的类: private final int period = 1000; 在这个特殊的情况下,作者原本打算使它也是静态的,因为价值在任何时候都无法改变,没有真正的function性理由不宣布它是静态的,但它让我想知道Java如何对待最终vs 。最终的静态原语。 特别是: 1)最终的静态基元是如何存储的? 它们是否只是直接编译成它们被使用的表达式? 2)如果它们实际上是分配存储,那么包含类的每个实例是否必须维护对该位置的引用? (在这种情况下,对于小于4个字节的基元,类的每个实例实际上都会比它直接包含基元时更大,就像它在非静态情况下那样) 3)编译器现在是否足够智能,以确定在上述情况下,变量是“有效静态的”,因为不可能让不同的实例包含不同的值,因此优化它与最终的静态值相似?