我想做两件事
创建一个私有实例变量,即地图
在我的构造函数中创建一个空实例,用于修饰地图并将其分配给上一个私有实例变量。
我拥有的私有实例是
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?
*/
}
答案 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()
,因为它是隐式的。