В Java заключительное поле может быть инициализировано от помощника конструктора?

У меня есть заключительный нестатический участник:

private final HashMap<String,String> myMap;

Я хотел бы инициализировать его с помощью метода, названного конструктором. Так как myMap является окончательным, мой метод "помощника" не может инициализировать его непосредственно. Конечно, у меня есть опции:

Я мог реализовать myMap код инициализации непосредственно в конструкторе.

MyConstructor (String someThingNecessary)
{
    myMap = new HashMap<String,String>();

    myMap.put("blah","blahblah");
    // etc...

    // other initialization stuff unrelated to myMap
}

У меня могла быть своя сборка вспомогательного метода HashMap, возвратиться, это конструктору, и иметь конструктора затем присваивает объект 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");
    // etc...

    return initializedMap;
}

Метод № 2 прекрасен, однако, я задаюсь вопросом, существует ли некоторый способ, которым я мог бы позволить вспомогательному методу непосредственно управлять myMap. Возможно, модификатор, который указывает на это, может только назвать конструктор?

MyConstructor (String someThingNecessary)
{
    InitializeMyMap(someThingNecessary);

    // other initialization stuff unrelated to myMap
}


// helper doesn't work since it can't modify a final member
private void InitializeMyMap(String someThingNecessary)
{
    myMap = new HashMap<String,String>();

    myMap.put("blah","blahblah");
    // etc...
}
42
задан csj 18 May 2010 в 17:32
поделиться

2 ответа

Способ №2 - лучший вариант. Проблема в том, что если у вас есть назначение в частном методе, ничто не препятствует другому коду в классе за пределами вызывающего его конструктора, что затем создало бы проблему с попыткой второго присвоения последнему полю.

В Java нет конструкции отдельного метода, который может быть вызван только во время построения.

Для полноты картины мы можем сделать третий вариант, в котором вы назначаете карту при инициализации, а затем заставляете вспомогательный метод заполнять ее:

 private final HashMap<String, String> myMap = new HashMap<String, String();

И затем:

 MyConstructor (String someThingNecessary)
 {
    initializeMyMap(someThingNecessary);

    // other initialization stuff unrelated to myMap
 }


 // helper doesn't work since it can't modify a final member
 private void initializeMyMap(String someThingNecessary)
 {

     myMap.clear();
    myMap.put("blah","blahblah");
    // etc...
  }

И если вы действительно хотите запутать, вы можете использовать инициализатор вместо конструктора, но вы не должны этого делать, поэтому, если вам действительно не нужно знать, я не буду подробно останавливаться на этом.

15
ответ дан 27 November 2019 в 00:00
поделиться

Вариант № 2 - это наиболее возобновляемый вариант, потому что вы можете использовать его для всех конструкторов. Здесь нам понадобятся инициализаторы коллекций C #. :)

(Кстати: # 3 не компилируется)

1
ответ дан 27 November 2019 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: