在Java中,最终的字段可以从一个构造函数助手初始化?

我有一个最终的非静态成员:

private final HashMap<String,String> myMap; 

我想用构造函数调用的方法初始化它。 由于myMap是final的,我的“helper”方法无法直接初始化。 当然我有select:

我可以直接在构造函数中实现myMap初始化代码。

 MyConstructor (String someThingNecessary) { myMap = new HashMap<String,String>(); myMap.put("blah","blahblah"); // etc... // other initialization stuff unrelated to myMap } 

我可以让我的帮助器方法构buildHashMap,将其返回给构造函数,然后让构造函数将对象分配给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是你最好的select。 问题是,如果你在一个私有方法中有一个赋值,那么在构造函数外部没有任何东西会阻止其他类的代码调用它,这样就会在尝试第二次赋值到最后一个字段时产生问题。

Java没有一个单独的方法构造,只能在构build过程中调用。

为了完整性,我们可以做第三个选项,在初始化的时候分配映射,然后用辅助方法填充它:

  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... } 

如果你真的想混淆你可以使用一个初始化,而不是一个构造函数,但你不应该这样做,所以除非你真的需要知道,我不会扩大。

如何实现一个私有构造函数来初始化你的HashMap,然后让你的主要构造函数调用这个私有构造函数?

例如 –

 // Helper function to initialize final HashMap. private MyConstructor() { myMap = new HashMap<String,String>(); myMap.put("blah","blah"); } MyConstructor (String someThingNecessary) { // Initialize the HashMap. this(); // Other initialization code can follow. } 

您可以根据需要修改私有助手构造函数的签名(例如提供参数数据或使签名与任何公共构造函数不同)。

选项#2是最合适的选项,因为您可以在所有构造函数之间共享它。 我们需要的是C#的集合初始值设定项。 🙂

(顺便说一句:#3不会编译)