JavaHashMap:key是两个Enum值的组合.是否有任何内置函数需要检查,这实际上是两个枚举的连接



我想在java中创建一个HashMap,其中key是String类型,它是两个枚举的连接。

样品:

枚举1:public enum Type1{NONE,VALIDATE,CONFIGURE}

枚举2:public enum Type2{A,B,C}

映射声明:Map<String, Class<? extends InterfaceTest>> enumClassMap

示例1:enumClassMap.put(Type2.A.name()+Type1.VALIDATE.name(),Test1.class)这是有效的一个,因为键是两个枚举的连接。

Ex2:enumClassMap.put(Type2.A.name(),Test1.class)这个是无效的,因为键不是两个枚举的连接。

我想检查密钥是否真的是Type1和Type2的连接。

我可以编写单独的代码来迭代所有的键并进行验证。但我想知道有没有内置的功能可以做到这一点?我的期望是,如果不是枚举的组合,java默认情况下应该抛出错误或异常。

当然不是。

但是,原则,当然是的。Java是非常标称的。类型应该准确地描述它们所代表的内容,并且应该尽可能具体

举个例子:String非常一般,根本不描述"类型com.foo.raghavan.Type1com.foo.raghavan.Type2的枚举名称的串联"的概念。

结论:此处的字符串不正确

为了实现具有高度描述性和特定类型名称的理想,您必须创建自己的类型。很多。然后这个问题会自行解决!

你的名字太笼统了,无法想出好名字,而好名字很重要。假设Type1CardSuit(具有CLUBS、SPADES等值(,Type2CardRank(具有TWOKINGACE等值(

import lombok.Value;
import lombok.NonNull;
@Value
public class Card {
@NonNull CardSuit suit;
@NonNull CardRank rank;
}
Map<Card, Class<? extends InterfaceTest>> map;

这有各种各样的优点:

  • 除非您提供1个有效等级和1个有效套装,否则根本不可能创建Card的实例。时期只有一个构造函数可以生成Card对象,它要求您传入等级和套装,并且也不接受null值
  • 如果你有一个键(例如,当你迭代映射的entrySet()并调用.getKey()时(,而不是试图将该字符串分解成相当复杂的组成部分,你可以。。在上面调用.getRank().getSuit()!是不是很好!你现在不需要这个其实并不重要。也许你明天需要它(
  • 该声明现在读起来更有用。Map<String, Class<? extends Thingie> enumMap的意思是几乎没有。如果我自己打印出来,走过一个java会议,问人们这个地图可能会做什么,他们显然完全不知道。即使我也打印出String的API。而如果我给他们看:Map<Card, Integer> scoreValues;,我也给他们看Card的API(即:它有getRankgetSuit(,那么几乎每个人都会告诉我:哦,我明白了。这可能是一种纸牌游戏,某些纸牌在游戏结束时会对你的分数有所贡献。换言之,更接近

注意:这个代码段使用了Project Lombok,因为如果你使用特定的类型(这需要制作很多类型(,制作一个真正"工作良好"的类型(例如,可以用作映射中的键(,java的工作效果会更好,但你需要很多样板:getters、构造函数、toString和equals/hashCode方法,这很难做好。您的IDE可以生成它,但现在您需要维护大量的代码。龙目工程是一条出路。如果您使用的是较新版本的java,对于像这样的简单情况,public record Card {CardSuit suit; CardRank rank;}可以提供帮助,尽管您必须添加自己的null检查代码,而且与Project Lombok不同,您无法轻松创建此类内容的生成器。

免责声明:我是龙目计划的核心贡献者。

与其拥有Map<String,...>,为什么不拥有Map<Type1, Map<Type2, ...>>?只要您在分组中首先指定Type1,您就可以通过执行以下操作立即检查它是否是有效的对:

Type1 type1 = <some type one>
if (map.containsKey(type1)) {
//if true it must contain a type2 mapping.
}

相关内容

  • 没有找到相关文章

最新更新