我想做两件事
创建一个映射的私有(private)实例变量
在我的构造函数中创建一个空实例,该实例实现一个映射并将其分配给之前的私有(private)实例变量。
我的私有(private)实例是
private final Map<Character, SortedSet<String>> thesaurus =
new HashMap <Character, SortedSet<String>>();
但是如何在构造函数中创建一个实例变量,该实例变量将在构造函数创建时引用私有(private)变量同义词库。
例如
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?
*/
}
最佳答案
不清楚你在问什么,但这里有几点:
- 您不能在构造函数中声明实例变量;您必须将其声明为该类型的成员(即作为字段)。
- 您可以赋值到构造函数中已声明的实例变量。
- 您不必在构造函数中为实例变量赋值;你可以在声明中做到这一点。
当你这样写的时候:
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
block 中。
另一种选择是在实例初始化 block 中初始化字段:
private final Map<Character, SortedSet<String>> thesaurus;
{
thesaurus = new HashMap <Character, SortedSet<String>>();
}
还有另一种选择是将所述实例初始化 block 重构为辅助方法:
private final Map<Character, SortedSet<String>> thesaurus = emptyMap();
private static Map<Character, Sorted<String>> emptyMap() {
return new HashMap <Character, SortedSet<String>>();
}
引用资料
相关问题
- Initialize final variable before constructor in Java
- Proper way to declare and set a private final member variable from the constructor in Java?
- In Java, can a final field be initialized from a constructor helper?
- Java - Can final variables be initialized in static initialization block?
- Best Practice: Initialize class fields in constructor or at declaration?
关于java - 如何使用构造函数创建新 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3271320/