Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >findbugs反对匿名内部类。

findbugs反对匿名内部类。
EN

Stack Overflow用户
提问于 2014-02-24 10:48:01
回答 4查看 19.9K关注 0票数 11

此代码:

代码语言:javascript
代码运行次数:0
复制
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());
        }
    }));

触发Sonar中的违规行为,触发具有以下描述的findbug规则"SIC_INNER_SHOULD_BE_STATIC_ANON“:

这个类是一个内部类,但不使用它对创建它的对象的嵌入引用。此引用使类的实例更大,并可能使对创建者对象的引用比必要的时间更长。如果可能的话,这个类应该变成一个静态的内部类。由于匿名内部类不能被标记为静态的,为此需要对内部类进行重构,使其成为一个命名的内部类。

真的?这不是很挑剔吗?我真的应该在匿名内部类中重构一行方法以节省额外引用的成本吗?在这种情况下,它不可能将引用保存得超过必要的时间。

我不介意这样做,因为我们严格执行的编码标准是“零声纳违反”,但我强烈想在这里提出//NOSONAR的理由,因为imho将一行方法提取到静态内部会使代码更难理解。

java纯粹主义者是怎么想的?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-02-24 11:22:57

将评论转化为回答,首先,我可以相信,把它作为匿名的内部类是有道理的,即使这有一个明确的技术理由来挑剔。

尽管如此,我还是要说:遵循您设置的规则。规则创建一致性,当所有代码都以相同的方式编写时,代码库作为一个整体更容易理解。如果某些规则是坏的,在任何地方都禁用它。

当有例外的时候,也需要解释为什么会有例外:对阅读代码的人来说是额外的精神负担,在代码评审中需要讨论的额外项目等等。只有在个别情况下,如果你认为这是一种例外情况,才需要禁用规则。

此外,我也不确定将它作为静态类来执行会更难理解,即使它添加了更多的样板(如果下面不是100%正确的代码,那么我的Java就有点生疏了,尽管可以建议编辑):

代码语言:javascript
代码运行次数:0
复制
Set<Map.Entry<String, SSGSession>> theSet 
    = new TreeSet<Map.Entry<String, SSGSession>>(new SSGSessionStartTimeComparator());

然后在文件中的其他地方,连同其他静态类:

代码语言:javascript
代码运行次数:0
复制
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());
    }
}
票数 11
EN

Stack Overflow用户

发布于 2014-02-25 01:54:42

为了完整起见,我想在已经提供的优秀答案的基础上添加另一个变体。为Comparator定义一个常量,并使用它:

代码语言:javascript
代码运行次数:0
复制
private static final Comparator<Map.Entry<String, SSGSession>> BY_STARTTIME =
        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());
    }
};

private void foo() {
    Set<Map.Entry<String, SSGSession>> theSet =
        new TreeSet<Map.Entry<String, SSGSession>>(BY_STARTTIME);
}

这将节省额外的类,就像在hyde's answer中一样。否则,hyde的答案会更好,因为它允许您声明Comparator是可序列化的(因为它没有状态)。如果Comparator不可序列化,您的TreeSet也不能序列化。

票数 4
EN

Stack Overflow用户

发布于 2014-02-24 20:12:39

这里有三种解决方案,其中最好的方法是您无法控制的:

  • 扩展Java语法: ..。theSet =新的静态比较器。
  • 如所述,声明和使用静态类。
  • 忽略此实例中的警告: @SuppressFBWarnings("SIC_INNER_SHOULD_BE_STATIC_ANON") ...你的方法..。

我更喜欢第一种,但这是一段很长的时间。因此,在忽略整个规则项目之前,我会选择最后一个。选择一条规则需要一点痛苦才能推翻它;否则,它只是一种约定或建议。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21996330

复制
相关文章
匿名内部类何为匿名?
比如为什么称之为匿名? 为什么也算是一个类,而且是内部类? 它和内部类有什么区别?
PhoenixZheng
2018/08/07
7250
匿名内部类
内部类:在一个类的内部定义了另外的类,称为内部类。 匿名内部类指的是没有名字的内部类。 为了清楚内部类的主要作用,下面首先来观察如下的程序:
葆宁
2019/04/18
5160
匿名内部类
java匿名内部类
匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。这就要采用另一种形式的new语句,如下所示: new <类或接口> <类的主体> 这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。它还创建那个类的一个新实例,并把它作为语句的结果而返回。要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。如果匿名类对另一个类进行扩展,它的主体可以访问类的成员、覆盖它的方法等等,这和其他任何标准的类都是一样的。如果匿名类
10JQKA
2018/05/09
9720
java匿名内部类
show the code : package com.test.jwen.httpApiAuto; public class AInter { public void m0(){           System.out.println("1");      } public static void main(String[] args){ new AInter().m0(); new AInter(){ public void m0(){                    System
千往
2018/01/24
5120
anonymousinnerclass(匿名内部类)
anonymousinnerclass(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 匿名内部类在实现时必须借助一个接口或者一个抽
一觉睡到小时候
2019/07/04
4670
Java 匿名内部类
正常的规律一个接口或者抽象类需要有子类,子类要覆写所有的抽象方法;但如果,message子类只使用唯一的一次;所以,可以采用匿名内部类的方式进行代码的简化。
Mirror王宇阳
2020/11/10
4150
java匿名内部类简介
匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实例1:不使用匿名内部类来实现抽象方法 abstract class Person { public abstract void eat(); } class Child extends Person { public void eat() { System.out.println("eat something"); } } public cl
java达人
2018/01/31
6600
Java中,匿名内部类
前提:存在一个类或者接口。   这里的类可以是具体类也可以是抽象类。 格式:   new 类名或者接口名() {     重写方法;   } 匿名内部类的本质是什么呢?   答:是一个继承了该类的子类或者实现了该接口的实现类(子类)的匿名对象。   简言之:匿名内部类是一个子类的匿名对象。 再简言之:匿名内部类是子类的对象。 小结:匿名内部类是一个结合体,是子类和对象的结合体。
黑泽君
2018/10/11
1.1K0
java之匿名内部类
Person.java package insof; public class Person extends Object{ String name; static int age; public Person() { this.name = "tom"; System.out.println("执行的是构造方法"); } public void test(){ System.out.println("Person的t
西西嘛呦
2020/08/26
3090
Java-匿名子类(匿名内部类)
版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
Fisherman渔夫
2019/07/31
3.7K0
Java-匿名子类(匿名内部类)
什么是匿名内部类?
匿名内部类 :是内部类的简化写法。它的本质是一个 带具体实现的 父类或者父接口的 匿名的 子类对象。
Twcat_tree
2022/11/30
2830
Java内部类-成员内部类、局部内部类、匿名内部类、静态内部类
在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。我们知道类的五大成员:属性、方法、构造器、代码块、内部类。内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系。
joshua317
2021/12/17
1.2K0
Java内部类-成员内部类、局部内部类、匿名内部类、静态内部类
java_内部类、匿名内部类的使用
创建内部类对象格式: 外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
咕咕星
2020/08/19
6640
内部类, 静态内部类, 局部类, 匿名内部类的解析和区别
众所周知,外部顶级类的类名需和类文件名相同,只能使用public和default。而内部类是指在外部类的内部再定义一个类,类名不需要和文件名相同。内部类可以是静态static的,也可用public,default(包限定),protected和private修饰。
挨踢小子部落阁
2019/09/25
2.5K0
内部类, 静态内部类, 局部类, 匿名内部类的解析和区别
Java中的内部类与匿名内部类详解
在描述事物时,若一个事物内部还包含其他事物,就可以使用内部类这种结构。比如,电脑类Computer 中包含中央处理器类Cpu ,这时, Cpu 就可以使用内部类来描述,定义在成员位置。 代码举例:
共饮一杯无
2022/11/28
1.5K0
Java内部类——静态和非静态内部类、匿名内部类、方法内部类
概念讲义转载自https://www.sxt.cn/Java_jQuery_in_action/five-inner-class.html
逆回十六夜
2019/08/09
9240
Java学习笔记 (成员内部类、静态内部类、匿名内部类、方法内部类)
1、内部类在外部使用时,无法直接实例化,需要借由外部类信息才能完成实例化 2、内部类的访问修饰符,可以任意,但是访问范围会受到影响 3、内部类可以直接访问外部类成员;如果出现同名属性,优先访问内部类中定义的 4、可以使用外部类.this.成员的方式访问外部类中同名的成员信息 5、外部类访问内部类信息,需要通过内部类实例,无法直接访问 6、内部类编译后.class文件命名:外部类$内部类.class 7、内部类中是否可以包含与外部类相同的方法签名的方法
用户5513909
2023/04/25
5070
java 匿名内部类(Anonymous Class)
参考链接: Java类之anonymous 原文链接:  点击打开链接  1. 匿名类需要继承一个方法或接口  不使用匿名内部类来实现抽象类  abstract class Person{     public abstract void eat(); } class Child extends Person{     public void eat(){         System.out.println("eat something");     } } public class Ordina
用户7886150
2021/04/07
5980
Java基础系列(三十):局部内部类,匿名内部类
当我们在外围类中定义的内部类仅仅在某个方法中使用了一次,这种情况下,我们就可以选择去使用局部内部类。
山禾说
2019/01/21
7470
Android(Java) | 你真的熟悉Java匿名内部类吗(Java匿名内部类的限制)
如上代码, new Foo()在定义的时候, 重写了bar()这个方法, 如此一来new Foo(){...}这里就是一个匿名内部类了; 呐这个匿名内部类,实际上在字节码中是会定义出来的,!!! 定义出来一个用于定位的“名字”, 这个“名字”可见上面代码的第二行, “com.bennyhuo.iiv.ch1.”即代码包名, “OuterClass$1”即外部内名$1, 1代表这个匿名内部类, 是前缀的外部类中,定义的第一个匿名内部类, 再创建第二个匿名内部类 就是$2了; 所以匿名内部类跟普通类一样,是可以加载出来的!!! 只不过参数格式不一样, 普通类是“class 类名” 匿名内部类是“class 包名.外部类名$num”
凌川江雪
2019/11/11
1.8K0

相似问题

匿名内部类

32

宣布匿名内部类

62

Kotlin匿名内部类

16

Java匿名内部类

10

注释匿名内部类

32
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文