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

如何断言HashMap键与ArchUnit具有可比性?

缪朝
2023-03-14

背景:https://dev.to/carey/java-map-keys-should-always-be-comparable-2c1b

我想要达到的目标:

  1. 查找使用HashMap的代码

我被困在第二步

noClasses().that()
        .containAnyFieldsThat(have(rawType(HashMap.class)))
        .should()...

你知道如何得到泛型类的类型吗?谢谢你的支持。

共有1个答案

廖华翰
2023-03-14

你的ArchLaw的关键部分(可以直接基于字段())可以用一个自定义的Arch条件来表示:

@ArchTest
static final ArchRule fields_of_type_HashMap_should_have_Comparable_key = fields()
    .that().haveRawType(HashMap.class)
    .should(new ArchCondition<>("have Comparable key") {
        @Override
        public void check(JavaField field, ConditionEvents events) {
            JavaType fieldType = field.getType();
            if (fieldType instanceof JavaParameterizedType) {
                JavaType keyType = ((JavaParameterizedType) fieldType).getActualTypeArguments().get(0);
                boolean satisfied = keyType.toErasure().getAllRawInterfaces().stream()
                        .anyMatch(rawInterface -> rawInterface.isEquivalentTo(Comparable.class));
                String message = String.format("%s's key (%s) %s Comparable",
                        field.getDescription(), keyType.getName(), satisfied ? "is" : "is not");
                events.add(new SimpleConditionEvent(field, satisfied, message));
            } else {
                events.add(SimpleConditionEvent.violated(field, field.getDescription() + " is not parameterized"));
            }
        }
    });
 类似资料:
  • 我正在尝试修改哈希映射。“value”是由逗号分隔的值组成的单个字符串。(例如:“aid=abc,bid=def,cid=gh2”) 我需要用DB中的相应值替换它们中的特定值。(例如,将bid更改为123,这将导致上述“值”字符串为:“aid=abc,bid=123,cid=gh2”) 然后将修改后的“value”设置为相应的键,以便hashmap由修改后的值组成。 我尝试遍历键,并使用将给出值的

  • 问题内容: 今天,我看到了一个带有Java断言而不是JUnit断言的JUnit测试用例-相对于另一个而言,优先选择一个优点还是缺点? 问题答案: 在JUnit4中,JUnit断言引发的异常(实际上是Error)与java 关键字(AssertionError)引发的错误相同,因此它与堆栈跟踪完全相同,除了您无法分辨出其区别。 话虽这么说,断言必须在JVM中使用特殊标志运行,导致许多测试似乎通过了,

  • 我有一个哈希图,其中一些键指向相同的值。我想找到所有相等的值并打印相应的键。 这是我拥有的当前代码: 当前代码将重复项两次添加到列表中,但它也将每个键添加一次。 谢谢。

  • 问题内容: 考虑以下代码: 程序的输出为: 这里,键如何相互关联。是否所有三个都分配给相同的哈希码?如果是,为什么? 由于这三个值看起来都不同,因此一个值的更改会更改另一个值。这是否意味着只将一个密钥项输入 到任一密钥中,因为所有密钥项都被视为相同的密钥。 问题答案: 当将 null 作为键传递并且null作为特殊情况处理时,不会调用哈希码。 放置方法 将 null 键放在存储区 0中, 并将 n

  • 房间类别 长话短说,这一点是为了添加房间,并能够导航它们,捡起物品,然后放下它们。在我尝试运行程序时,我注意到我不能有多个北/南/东/西键。我怎样才能避开这件事,这样我才能把它做好?