使用类作为 Map 的键是一个坏主意吗?

问题描述 投票:0回答:1

我有一个用例,我想根据引发的

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

java exception comparable
1个回答
0
投票

使用类作为 Map 的键是一个坏主意吗?

完全不是,映射键应该始终是派生数据类型。即使我们传递的是原始数据类型,它也会被向上转换为相应的包装类型。

使用某些东西作为未实现 Comparable 的 Map 的键

Comparable 或 Comparator 是在类上使用的接口,以确保该类在对相同集合进行排序时提供比较机制。仅当您尝试对地图进行排序时(TreeMap),这才会出现。

一些内置类已经实现了上述接口,但是

Exception
类通常不会实现它,因为它们不会在排序场景中使用。因此,您可以忽略该警告,它发出警告,表明如果您的
map
初始化为
TreeMap
,可能会导致 ClassCastException

PS:我们将向 Map 提供类的引用,但我们不能向 Map 提供类Class vs Reference

© www.soinside.com 2019 - 2024. All rights reserved.