findbugs反对匿名内部类

Ste*_*son 10 java findbugs sonarqube

这段代码:

Set<Map.Entry<String, SSGSession>> theSet =  new TreeSet<Map.Entry<String, SSGSession>>(new Comparator<Map.Entry<String, SSGSession>>() {

        @Override
        public int compare(final Map.Entry<String, SSGSession> e1, final Map.Entry<String, SSGSession> e2) {
            return e2.getValue().getStartTime().compareTo(e1.getValue().getStartTime());
        }
    }));
Run Code Online (Sandbox Code Playgroud)

触发Sonar中的违规行为,绊倒了具有以下描述的findbugs规则"SIC_INNER_SHOULD_BE_STATIC_ANON":

此类是内部类,但不使用其对创建它的对象的嵌入式引用.此引用使类的实例更大,并且可以保持对创建者对象的引用超过必要的时间.如果可能,该类应该成为静态内部类.由于匿名内部类不能标记为静态,因此执行此操作将需要重构内部类,以便它是一个命名的内部类.

真?这不是很挑剔吗?我是否应该在匿名内部类中重构一行方法以节省额外引用的成本?在这种情况下,它不可能长时间保持参考.

我不介意这样做,因为我们强烈执行的编码标准是"零声纳违规",但我很想在//NOSONAR这里争论一个案例,因为imho将一行方法提取到静态内部会使代码稍微变得难以神交.

java纯粹主义者的想法是什么?

hyd*_*yde 10

将评论转换为答案,首先我可以说服这个作为匿名内部阶级的人可以被证明是合理的,即使有明确的技术理由对此不屑一顾.

不过,我会说:遵循你设定的规则.规则创建一致性,当所有代码以相同的方式编写时,代码库作为一个整体更容易理解.如果某些规则不好,请在任何地方禁用它.

当有异常时,还需要解释为什么会有异常:给读取代码的人带来额外的心理负担,在代码审查中讨论的额外项目等等.如果你认为它是某种情况,只能在个别情况下禁用规则例外情况.

另外,我不确定这样做,因为静态类不太容易理解,即使它添加了更多的样板(如果下面不是100%正确的代码,我的Java有点生疏,随时建议编辑) :

Set<Map.Entry<String, SSGSession>> theSet 
    = new TreeSet<Map.Entry<String, SSGSession>>(new SSGSessionStartTimeComparator());
Run Code Online (Sandbox Code Playgroud)

然后在文件的其他地方,以及其他静态类:

static class SSGSessionStartTimeComparator extends Comparator<Map.Entry<String, SSGSession>>() {
    @Override
    public int compare(final Map.Entry<String, SSGSession> e1, final Map.Entry<String, SSGSession> e2) {
        return e2.getValue().getStartTime().compareTo(e1.getValue().getStartTime());
    }
}
Run Code Online (Sandbox Code Playgroud)