如何使用构造函数创建新地图?

时间:2010-07-17 11:40:35

标签: java

我想做两件事

  1. 创建一个私有实例变量,即地图

  2. 在我的构造函数中创建一个空实例,用于修饰地图并将其分配给上一个私有实例变量。

  3. 我拥有的私有实例是

    private final Map<Character, SortedSet<String>> thesaurus = 
                          new HashMap <Character, SortedSet<String>>();
    

    但是如何在构造函数中创建一个实例变量,该变量将在构造函数创建时引用私有变量同义词库。

    例如

    public class Book{
    
        private final Map<Character, SortedSet<String>> thesaurus = 
                               new HashMap <Character, SortedSet<String>>();
    
    public Book(){
    
        super();    
        /* What do i put here as an empty instance 
         * variable that implements a map and how 
         * do i assign it to thesaurus? 
         */
    }
    

2 个答案:

答案 0 :(得分:7)

目前尚不清楚你在问什么,但这里有一些观点:

  • 你不能在构造函数中声明一个实例变量;你必须将它声明为该类型的成员(即作为一个字段)。
  • 您可以将值分配给构造函数中已声明的实例变量。
  • 不必为构造函数中的实例变量赋值;你可以在声明中做到这一点。

当你写这样的东西时:

public class Book{

   private final Map<Character, SortedSet<String>> thesaurus =
      new HashMap <Character, SortedSet<String>>(); 
   //...

}

然后,您已将thesaurus声明为class Book的实例变量,并且您还将其值初始化为new HashMap。由于此字段为final,因此您无法再将其值设置为其他任何内容(禁止基于反射的攻击)。

如果您愿意,可以将初始化移动到构造函数中。即使字段为final(根据各种明确的分配规则),您也可以这样做。

public class Book{

   private final Map<Character, SortedSet<String>> thesaurus;

   public class Book {
      thesaurus = new HashMap <Character, SortedSet<String>>();
   }
   //...

}

这样的事情有时会在例如创建初始值可能会抛出一个已检查的异常,因此需要放在try-catch块中。

另一种选择是初始化实例初始化程序块中的字段:

   private final Map<Character, SortedSet<String>> thesaurus;

   {
      thesaurus = new HashMap <Character, SortedSet<String>>();
   }

另一种选择是将所述实例初始化程序块重构为辅助方法:

   private final Map<Character, SortedSet<String>> thesaurus = emptyMap();

   private static Map<Character, Sorted<String>> emptyMap() {
      return new HashMap <Character, SortedSet<String>>();
   }

参考

相关问题

答案 1 :(得分:1)

您已经使用地图初始化同义词库变量。您可以将其移动到构造函数,例如:

public class Book
{
  private final Map<Character, SortedSet<String>> thesaurus;

  public Book(){
    this.thesaurus = new HashMap <Character, SortedSet<String>>();    
  }
}
但是,没有必要改变。无论哪种方式,每次创建实例时都会初始化实例字段。另请注意,此处不需要super(),因为它是隐式的。