Java 良好的 HashMap 实践? (静态最终 HashMap)

Java good HashMap practices? ( static final HashMap )

    private static final HashMap<String, Commande> COMMAND_DIRECTORY = new HashMap<>();

    static {
        COMMAND_DIRECTORY.put("help", new Help());
    }

此代码块是否包含不良的 HashMap 做法?

不建议这样写:

HashMap<String, Commande> COMMAND_DIRECTORY = new HashMap<>();

更好的方法是这样写:

Map<String, Commande> COMMAND_DIRECTORY = new HashMap<>();

这样,如果您将来决定选择不同的 Map 实施方式,它将更加简单,因为您不受特定实施方式的限制。

我宁愿避开尖叫的 case 变量,ide 会告诉你某些东西是最终的,你甚至在声明之前写 final。对于 static {},没有人使用它,从我的角度来看,它看起来有点太间接,因此我会写。

 private static final HashMap<String, Commande> commandDirectory = new HashMap<String, Commande>(){{
   put("help", new Help())
}};
  

无论如何,这就是我在严肃的代码库中看到的

是的。将可变 Map 保留为静态 final 是有问题的。

private static final Map<String, Commande> COMMAND_DIRECTORY;

static {
    Map<String, Commande> directory = new HashMap<>();
    directory.put("help", new Help());
    COMMAND_DIRECTORY = Collections.unmodifiableMap(directory);
}

Map.of

最新版本的 Java 提供了 Map.of 方法来生成不可修改的 Map 具有方便的文字语法的对象。

private static final Map < String , Command > commands = 
    Map.of (
        "help", new Help() , 
        "whatever" , new Whatever() 
    )
;

正如其他人提到的,最好将您的变量声明为更抽象的类型、更通用的接口或 superclass,而不是狭义的具体类型。因此,将变量声明为 MapHashMap 更好。对于此答案的代码,我们 必须 声明为 Map,因为我们不知道 Map.of 可能实例化的具体 class。

正如其他人指出的那样,通常最好只在命名对象高度不可变的情况下使用所有大写名称。