【问题标题】:Sonar compliant way to map Enum to Name将枚举映射到名称的符合声纳的方法
【发布时间】:2021-05-26 04:59:36
【问题描述】:

我有以下方法将我项目中的各种枚举映射到他们的名字,但声纳抱怨Code smell·Provide the parametrized type for this generic.

public static String mapToName(Enum customEnum) {
        return Optional.ofNullable(customEnum).map(Enum::name).orElse("");
    }

无法为我的项目中的数十个枚举创建单独的mapToName 方法,如何使上述方法声纳兼容?

【问题讨论】:

    标签: java sonarqube optional


    【解决方案1】:

    首先,请不要使用Optional 代替if-else 语句。它们不是为此目的而设计的。 Optional 旨在传达代码中公共接口中空值的可能性,而不仅仅是文档,仅此而已。即使在私有方法中使用 optional 也违背了它的意图(你应该知道自己的代码做了什么)。

    请阅读 Optional 类背后的一位架构师的回答:Should Java 8 getters return optional type?

    作为练习,您应该查看 Optional 的源代码,并计算您为 每个 名称映射操作创建的一次性对象的数量。

    至于你的问题,这是解决即时声纳投诉的正确方法:

    public static String mapToName(Enum<?> customEnum) {
        return customEnum == null ? "" : customEnum.name();
    }
    

    问号是wildcard,表示未知类型。

    【讨论】:

      【解决方案2】:
      public static <T extends Enum<T>> String mapToName(Enum<T> customEnum) {
          return Optional.ofNullable(customEnum).map(Enum::name).orElse("");
      }
      

      如果你在琢磨奇怪的T extends Enum&lt;T&gt;Why in java enum is declared as Enum<E extends Enum<E>>

      【讨论】:

      • 我不确定我是否理解,您建议如何实现该功能?
      • 你有道理,你不需要它。我猜它只是把代码弄乱了。
      猜你喜欢
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 2019-08-14
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多