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

use*_*537 7 java

我想做两件事

  1. 创建一个私有实例变量,它是一个映射

  2. 在我的构造函数中创建一个空实例,它实现了一个地图并将其分配给前一个私有实例变量.

我拥有的私有实例是

private final Map<Character, SortedSet<String>> thesaurus = 
                      new HashMap <Character, SortedSet<String>>();
Run Code Online (Sandbox Code Playgroud)

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

例如

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? 
     */
}
Run Code Online (Sandbox Code Playgroud)

pol*_*nts 7

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

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

当你写这样的东西:

public class Book{

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

}
Run Code Online (Sandbox Code Playgroud)

然后你声明thesaurus是一个实例变量class Book,你也将它的值初始化为a new HashMap.由于此字段是final,您不能再将其值设置为其他任何值(禁止基于反射的攻击).

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

public class Book{

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

   {
      thesaurus = new HashMap <Character, SortedSet<String>>();
   }
Run Code Online (Sandbox Code Playgroud)

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

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

   private static Map<Character, Sorted<String>> emptyMap() {
      return new HashMap <Character, SortedSet<String>>();
   }
Run Code Online (Sandbox Code Playgroud)

参考

相关问题


归档时间:

查看次数:

36604 次

最近记录:

10 年,3 月 前