我有一个用例,我想根据引发的
Exception
的类型记录不同的字符串。为了实现这一点,我编写了一个 Map
,它将 Class
映射到 String
。我正在检查凸起的 Exception
是否是地图中任何类的实例,如果是,我会记录与其一起存储的相应字符串。
使用
Class
作为 Map
的键是一个坏主意吗?我正在使用 SonarLint 进行静态代码分析,它抱怨我使用某些东西作为 Map
的键,而它没有实现 Comparable
。有多糟糕?有更好的方法来解决我的用例吗?
示例代码-
Map<Class<? extends Exception>, String> map = Map.of(A.class, "Log A", B.class, "Log B", C.class, "Log C");
map
.entrySet()
.stream()
.filter(entry -> entry.getKey().isInstance(raisedException))
.findFirst()
.ifPresentOrElse(
entry -> log.warn(entry.getValue()),
() -> log.warn("Unknown exception class: {}.", raisedException.getClass()));
SonarLint 规则 - https://rules.sonarsource.com/java/RSPEC-6411
使用类作为 Map 的键是一个坏主意吗?
完全不是,映射键应该始终是派生数据类型。即使我们传递的是原始数据类型,它也会被向上转换为相应的包装类型。
使用某些东西作为未实现 Comparable 的 Map 的键
Comparable 或 Comparator 是在类上使用的接口,以确保该类在对相同集合进行排序时提供比较机制。仅当您尝试对地图进行排序时(TreeMap),这才会出现。
一些内置类已经实现了上述接口,但是
Exception
类通常不会实现它,因为它们不会在排序场景中使用。因此,您可以忽略该警告,它发出警告,表明如果您的 map
初始化为 TreeMap
,可能会导致 ClassCastException。
PS:我们将向 Map 提供类的引用,但我们不能向 Map 提供类(Class vs Reference)