У меня есть заключительный нестатический участник:
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...
}
Способ №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...
}
И если вы действительно хотите запутать, вы можете использовать инициализатор вместо конструктора, но вы не должны этого делать, поэтому, если вам действительно не нужно знать, я не буду подробно останавливаться на этом.
Вариант № 2 - это наиболее возобновляемый вариант, потому что вы можете использовать его для всех конструкторов. Здесь нам понадобятся инициализаторы коллекций C #. :)
(Кстати: # 3 не компилируется)