2013-12-09 4 views
1

Этот вопрос расширяет Initialize final variable before constructor in Java, так как меня не устраивало предоставленный там ответ.Инициализировать конечную переменную перед конструктором в Java

У меня такой же вопрос. У меня есть переменные, которые мне нужно установить как final, но я не могу этого сделать, потому что мне нужно установить их в значения, которые требуют исключения, чтобы сделать их невозможными, если я не поместил их в конструктор. Проблема в том, что я тогда должен сделать новый экземпляр объекта каждый раз, когда я хочу, чтобы ссылаться на finalstatic переменные, которые на самом деле не имеет смысла ...

пример, где 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

'public Configuration() throws IOException, URISyntaxException {' изменяется на 'static throws IOException, URISyntaxException {'? – ThreaT

+0

Как бы вы установили 'path = propertiesUtility.readProperty (« путь »);' если он уже объявлен как «final» без какого-либо определения? – ThreaT

+1

«Конечная величина переменной срабатывает только после ее определения. Таким образом, можно объявить его без определения, а затем установить его (например, установить из свойств) позже, если вы делаете это только один раз – Matt

Смежные вопросы