使用另一种方法的HashMap?

时间:2019-02-26 22:10:06

标签: java

如果我有如下所示的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。

谢谢

3 个答案:

答案 0 :(得分:1)

您可以将其定义为静态,也可以通过其所在类的实例创建get方法并 get

Java静态: https://www.javatpoint.com/static-keyword-in-java

答案 1 :(得分:0)

需要注意的地方:

当您声明类static的成员时,该成员不与您创建的类的任何实例相关联。有了这些信息,您实际上必须考虑如何构造程序。

如果必须init保留方法签名,则可以使wordDefinitions成为类的static成员并从init访问它。但是,如果您确实采用这种方法,则在引用它时要小心。请记住,wordDefinitions只有一个实例。因此,您只能通过引用您的类(Scratch)来访问它,而不能引用它的实例。

答案 2 :(得分:0)

标题问题的准确答案是“你不能”。这是原因:

名为wordDefinitions的变量在init方法之外不存在。 Java的作用域规则说,它每次执行init时就存在,而init终止时不再存在。因此,从外部init访问它没有任何意义。

bookList类似,这就是为什么将wordDefinitions的声明移到init之外时无法访问bookList的原因。

您可能会受益于Java范围规则的回顾。但是现在,这是一个大概的指南。对于任何数据,您都需要确定其寿命:

  1. 一个“始终”存在的副本独立于类的任何实例:在类中将其声明为静态。

  2. 在实例生命周期中存在的每个实例的副本:在类中将其声明为非静态的(并可能在构造函数中对其进行初始化)。

  3. 仅在方法执行时存在的数据:在方法主体中声明它。

鉴于上述情况,您可以在列表中“向上”访问数据,但不能“向下”访问数据。

这掩盖了变量和它所引用的对象之间的区别,但是我试图使其简单。

对于您当前的问题,如果您希望拥有所有静态方法(这似乎是入门学生要做的事情–您是这样教的吗?如果是这样,我不想通过提出不同的建议来混淆问题),应该使用静态限定符将wordDefinitions的声明移至类范围。仍可以在init中完成在图书清单中的加载。