【问题标题】:Is it possible to disable "Optional used as field or parameter type" inspection in IntelliJ for private methods?是否可以在 IntelliJ 中为私有方法禁用“可选用作字段或参数类型”检查?
【发布时间】:2019-07-11 14:55:57
【问题描述】:

我不想disable the warning altogether,我已经知道why you supposedly shouldn't use Optional as a parameter。但是,我认为这与我的情况无关。

出于说明目的,我的代码如下所示:

//IntelliJ reports: 'Optional<ForeignDataTransferObject>' used as type for parameter 'data'
private LocalSystemPerson extractPerson(Optional<ForeignDataTransferObject> data) {
    return data
            .map(data -> data.getPeopleListWrapper())
            .map(peopleListWrapper -> peopleListWrapper.getList())
            .map(listOfForeignPeople -> listOfForeignPeople.stream())
            .orElseGet(Stream::empty)
            .findFirst()
            .map(foreignPerson -> convertToLocalSystemPerson(foreignPerson))
            .orElse(someFallbackValue);
}

它获取人员列表,然后是第一个项目,然后转换它。由于我正在调用一个外部 API 并获取一个带有一堆字段的数据传输对象,这些字段中的任何一个都可以为空,因此任何集合都包装在一个额外的类中,即使这样,获取一个空列表也是一个有效的情况。所以,我最终得到了一个像这样的冗长代码来转换单个值。我将它隐藏在一个单独的辅助方法中,以避免在一个地方出现所有冗长的内容。

但是 IntelliJ 抱怨我传递了一个 Optional 参数。这是我通常会同意的,但如果它是我用来保存另一种方法过长的私有方法,我不认为这是一个问题——我可能需要从数据传输中获取多个值目的。

  • 我仍然想避免创建接受Optional 的公共方法或持有Optional 的字段,但我想禁用对私有方法的检查。
  • 我宁愿不必annotate each method with @SuppressWarnings("OptionalUsedAsFieldOrParameterType"),因为它很快就会变得烦人。我可以在接受一些外部 DTO 的各种类中拥有多个这些方法。
  • 同样,我也不想传入非Optional 参数,只是为了将其包装在方法中。特别是因为在某些情况下我只有一个Optional,所以我必须打开它,然后用myMethod(data.orElse(null)) 之类的东西把它包回去,然后在方法中执行Optiona.ofNullable(parameter)

总而言之,即使它不会跨系统或跨层传输数据等,总是将其视为问题似乎是一个不合理的限制。

那么,我可以从设置中仅针对私有方法而不是其他方法禁用它吗?

【问题讨论】:

    标签: java intellij-idea intellij-inspections


    【解决方案1】:

    目前没有禁用私有方法检查的选项。请在 YouTrack 关注/评论为您的功能请求创建的问题: https://youtrack.jetbrains.com/issue/IDEA-207468 谢谢

    【讨论】:

    • 谢谢。我认为现在可能有办法做到这一点,但我就是想不通。我有点难过,没有可配置的方法 - 检查似乎很合理,只是将它用于本地私有方法没有任何建议 IntelliJ 在这种情况下做什么。当然,我不知道什么建议起作用,但除了添加注释来抑制它或完全禁用它之外什么都没有的警告似乎很奇怪。