如果我有如下所示的HashMap,如何从其他方法中利用它?在这种情况下,是从Main吗?
public class Scratch {
public static void init() {
WordEnums words = new WordEnums();
List<String> bookList = new ArrayList<String>();
for (WordEnums.Book bookValues : WordEnums.Book.values()) {
bookList.add(bookValues.getDefinition());
}
HashMap<String, Object> wordDefinitions = new HashMap<>();
wordDefinitions.put("book", bookList);
}
public static void main(String[] args) {
List<String> book = (List<String>) wordDefinitions.get("book");
book.stream().forEach(s -> {
System.out.print(" ");
System.out.println(s);
});
}
我尝试将其移到init之外,类似于我能找到的here
但是这样做时,出现错误,无法在init中访问bookList。
谢谢
答案 0 :(得分:1)
您可以将其定义为静态,也可以通过其所在类的实例创建get方法并 get 。
答案 1 :(得分:0)
需要注意的地方:
当您声明类static
的成员时,该成员不与您创建的类的任何实例相关联。有了这些信息,您实际上必须考虑如何构造程序。
如果必须init
保留方法签名,则可以使wordDefinitions
成为类的static
成员并从init
访问它。但是,如果您确实采用这种方法,则在引用它时要小心。请记住,wordDefinitions
只有一个实例。因此,您只能通过引用您的类(Scratch
)来访问它,而不能引用它的实例。
答案 2 :(得分:0)
标题问题的准确答案是“你不能”。这是原因:
名为wordDefinitions
的变量在init
方法之外不存在。 Java的作用域规则说,它每次执行init
时就存在,而init
终止时不再存在。因此,从外部init
访问它没有任何意义。
与bookList
类似,这就是为什么将wordDefinitions
的声明移到init
之外时无法访问bookList
的原因。
您可能会受益于Java范围规则的回顾。但是现在,这是一个大概的指南。对于任何数据,您都需要确定其寿命:
一个“始终”存在的副本独立于类的任何实例:在类中将其声明为静态。
在实例生命周期中存在的每个实例的副本:在类中将其声明为非静态的(并可能在构造函数中对其进行初始化)。
仅在方法执行时存在的数据:在方法主体中声明它。
鉴于上述情况,您可以在列表中“向上”访问数据,但不能“向下”访问数据。
这掩盖了变量和它所引用的对象之间的区别,但是我试图使其简单。
对于您当前的问题,如果您希望拥有所有静态方法(这似乎是入门学生要做的事情–您是这样教的吗?如果是这样,我不想通过提出不同的建议来混淆问题),应该使用静态限定符将wordDefinitions
的声明移至类范围。仍可以在init
中完成在图书清单中的加载。