2013-12-09 76 views
1

这个问题扩展了Initialize final variable before constructor in Java,因为我对那里提供的答案不满意。在Java中的构造函数中初始化一个最终变量

我有同样的问题。我有变量,我需要设置为final,但我不能这样做,因为我需要将它们设置为需要异常被捕获的值,因此使它不可能,除非我把它们放在构造函数中。问题在于,我必须在每次想引用变量时才会创建对象的新实例,这些变量实际上没有意义...

一个示例,其中path不能在构造也不在构造函数中,除非new实例创建的每个对象是从不同的类引用时间:

public class Configuration { 

    private static final String path; 

    public Configuration() throws IOException, URISyntaxException { 
     propertiesUtility = new PropertiesUtility(); 
     path = propertiesUtility.readProperty("path"); 
    } 

} 
+0

难道你不能使用'try {...} finally {...}'来确保'path'总是被设置,满足'final'修饰符吗?在你的例子中,这将是微不足道的,但也许不是现实世界 - 在任何情况下,不清楚在异常情况下'路径'应该采取什么样的价值。 –

回答

0

,您仍然可以使用静态初始化器但你需要一些些装饰,用于存储一个异常,你应该在稍后的阶段拿起(比如在一个缺点中tructor)。

private static final String path; 
private static final java.lang.Exception e_on_startup; 

static {   
    java.lang.Exception local_e = null; 
    String local_path = null; 

    try { 
     // This is your old Configuration() method 
     propertiesUtility = new PropertiesUtility(); 
     local_path = propertiesUtility.readProperty("path"); 
    } catch (IOException | URISyntaxException e){ 
     local_e = e; 
    } 

    path = local_path; /*You can only set this once as it's final*/ 
    e_on_startup = local_e; /*you can only set this once as it's final*/  
} 
+0

'公共配置()抛出IOException,URISyntaxException {'更改为'静态抛出IOException,URISyntaxException {'? – ThreaT

+0

如何设置'path = propertiesUtility.readProperty(“path”);'如果它已经被声明为'final'没有任何定义? – ThreaT

+1

变量的'final'ity只有在它被定义后才会启动。所以可以在没有定义的情况下声明它,然后稍后设置它(例如从属性设置),只要你只做一次 – Matt

相关问题