当前位置: 首页 > 知识库问答 >
问题:

Java HashMap:键是两个枚举值的组合。是否有任何内置函数可以检查是否真的是两个枚举的concat

乐正心思
2023-03-14

我想在java中创建一个HashMap,其中键是String类型,这是两个枚举的组合。

样品:

Enum1:public enum Type1{NONE,VALIDATE,CONFIGURE}

Enum2:public enum Type2{A,B,C}

映射声明:Map

ex1:enumClassMap.put(Type2. A. name()Type1. VALIDATE. name(), Test1.class)这是有效的,因为key是由两个枚举组成的。

Ex2:enumClassMap。put(Type2.A.name(),Test1。类)此项无效,因为键不是两个枚举的concat。

我想检查key是否真的是Type1和Type2的conat。

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


共有2个答案

宇文俊明
2023-03-14

而不是有一张地图

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

蒯胜泫
2023-03-14

当然不会。

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

举个例子:String非常笼统,根本没有描述“类型com中枚举名称的串联”的概念。福。拉格万。键入1com。福。拉格万。类型2

结论:这里的字符串不正确。

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

你的名字太笼统了,想不出好名字,好名字很重要。所以,让我们假设Type1CardSuit(并具有值CLUBS,SPADES等),Type2CardRank(具有值TWO国王ACE等),然后你会:

import lombok.Value;
import lombok.NonNull;

@Value
public class Card {
  @NonNull CardSuit suit;
  @NonNull CardRank rank;
}

Map<Card, Class<? extends InterfaceTest>> map;

这有各种各样的好处:

  • 除非您提供1个有效等级和1个有效诉讼,否则根本不可能制作卡的实例。时期只有一个构造函数可以生成卡片对象,它要求您传入一个等级和一套,并且也不接受空值
  • 如果你有一个键(例如,当你迭代地图的entrySet()并调用时)。getKey()),而不是试图将该字符串重新分解为非常复杂的组成部分,您可以。。调用。getRank()。getSuit()在上面!太好了!你现在不需要这个其实并不重要。也许你明天需要它)
  • 这份声明现在读起来有用得多<代码>地图

注:这个片段使用了Project Lombok——因为如果你使用特定的类型(这需要制作很多类型),制作一个真正“运行良好”的类型(例如,可以用作映射中的键),java会更好地工作,但你需要很多样板:getters、构造函数、toString和equals/hashCode方法,这很难做好。你的集成开发环境可以生成它,但现在你有大量的代码要维护。Project Lombok是一种出路。如果你是在一个相当新的java版本上,对于像这样的简单情况,公共记录卡{CardSuit套装;CardRank排名;}可以有所帮助,尽管你必须添加自己的空检查代码,而且不像龙目岛项目,你不能轻易地为这些事情创建生成器。

免责声明:我是Lombok项目的核心贡献者。

 类似资料:
  • 问题内容: 我知道我可以这样做: 然后只需编写语句中所需的代码。 还有其他方法可以检查它们是否相等? 问题答案: 怎么了 if(!Arrays.equals(array1,array2)) 与相同,即是同一数组。这不是大多数人期望的。 比较数组的内容。

  • “String”类型的参数不能分配给“Types”类型的参数。

  • 问题内容: 无论如何,通过将其与给定的字符串进行比较来检查是否存在枚举?我似乎找不到任何这样的功能。我可以尝试使用该方法并捕获异常,但是据我了解,捕获运行时异常不是一种好习惯。有人有什么想法吗? 问题答案: 我不认为没有捕获异常的内置方法。您可以改用如下方式: 编辑: 正如乔恩·斯凯特(Jon Skeet)所述,每次调用时,都会通过克隆私有支持数组来工作。如果性能至关重要,则可能只需要调用一次,缓

  • 从这个问题,有可能注入map与枚举? 例如,我有枚举: 我有一些与实现的接口: 但这样的注入不起作用: 我想自动注入。如何修复它,在spring框架端生成这样的代码?

  • 我正在检查变量“auth”是否设置在\u POST或\u GET上,并需要两个不同的操作。我已经设法让它与if/else一起工作了,但它看起来很丑陋,很浪费? 如果未设置POST,请选中GET。如果设置了GET,则不执行任何操作 这里有一种全新的方法吗?像检查两者一样,如果两者都没有设置,则转到重定向,如果设置了一个,则继续页面? ^如果这些是可以接受的陈述,“什么都不做”部分应该是什么?