代码之家  ›  专栏  ›  技术社区  ›  csj

在Java中,最后一个字段可以从构造函数帮助器初始化吗?

  •  40
  • csj  · 技术社区  · 15 年前

    我有最后一个非静态成员:

    private final HashMap<String,String> myMap;
    

    我想使用构造函数调用的方法初始化它。由于mymap是最终的,所以我的“helper”方法无法直接初始化它。当然,我有选择:

    我可以直接在构造函数中实现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很好,但是,我想知道是否有某种方法可以让helper方法直接操纵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...
    }
    
    3 回复  |  直到 10 年前
        1
  •  13
  •   Yishai    15 年前

    方法2是您的最佳选择。问题是,如果您在私有方法中有一个赋值,那么除了调用它的构造函数外,类中没有任何其他代码可以阻止它,这将导致对最终字段进行第二次赋值时出现问题。

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

    为了完整性,我们可以选择第三个选项,在初始化时分配映射,然后让helper方法填充它:

     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
  •  13
  •   Ciro Santilli OurBigBook.com    10 年前

    如何实现一个初始化散列映射的私有构造函数,然后让主构造函数调用该私有构造函数?

    例如——

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

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

        3
  •  1
  •   Simon    15 年前

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

    (btw:3不会编译)