当前位置:  开发笔记 > 编程语言 > 正文

匿名vs命名的内部类? - 最佳做法?

如何解决《匿名vs命名的内部类?-最佳做法?》经验,为你挑选了4个好方法。

我有一个类,我们称之为LineGraph,它呈现一个折线图.我需要对它进行子类化,但派生类仅在一个地方使用,并且与使用它的类耦合.所以我使用内部类.

我看到两种方法:

匿名内部阶级

public class Gui {
    LineGraph graph = new LineGraph() {
        // extra functionality here.
    };
}

命名内部类

public class Gui {
    MyLineGraph graph = new MyLineGraph();

    private class MyLineGraph extends LineGraph {
        // extra functionality here.
    }
}

我不是匿名内部阶级的粉丝,因为坦率地说,我认为它看起来真的很难看.但是在一个仅在一个地方使用的子类的情况下,命名的内部类是否过度杀伤?什么是公认的做法?



1> Dan Lew..:

匿名内部类的一个优点是没有人可以在其他地方使用它,而可以使用命名的内部类(如果只是由创建它的类(如果是私有的)).这是一个小小的区别,但它确实意味着您可以保护内部类别不被意外地用于其他地方.

此外,使用匿名内部类可以让任何人阅读您的代码 - "这个类正在这里使用,而不是其他任何地方." 如果你看到一个命名的内部类,有人可能会认为它会在类中的多个位置使用.

它们非常相似,所以这两点都不是改变游戏规则的.我认为如果你使用匿名内部类进行一次性操作,并且在类中多次使用它时命名内部类,我认为它有助于清晰.


+1好点,但记住类也可以在函数内定义.这限制了它们的范围,并且可以很好地暗示它们具有非常本地化的用途.
这些是不使用匿名类的非常好的理由.:)

2> TofuBeer..:

(反对Daniel Lew)

匿名内部类的一个缺点是没有人可以在其他地方使用它,而可以使用命名的内部类(如果只是由创建它的类(如果是私有的)).这是一个小小的区别,但它确实意味着您可以帮助确保内部类不会在其他地方意外重新创建.

此外,使用匿名内部类可以让任何人阅读您的代码更加困难,因为他们必须解析这个无处不在的类.使用命名的内部类,您可以更多地组织源.

我见过有两个(或更多)匿名内部类具有完全相同代码的情况.特别是在GUI中(你可能有多个控件执行相同的操作),这可能会突然出现(我说的是生产代码,而不是我的学生编写的代码).

可读性问题是双向的,有些人发现匿名内部类更好,因为它可以让你看到一次发生的事情,其他人发现它分散了注意力.这部分归结为个人偏好.

如果你在一个实例中声明一个匿名的内部类,那么使一个类静态更有效,那么会有更多的开销,如果你不需要访问实例变量,那就浪费了(但可能不值得担心直到它出现问题).

我个人的偏好是使用非匿名类,因为它们可以在以后修改代码时提供更大的灵活性.


这是我对匿名内部类的丑陋.你正在阅读代码,突然间,这个类定义在一堆字段的中间.

3> Jon Skeet..:

为什么需要将其子类化?如果它只是覆盖现有的虚方法,我认为匿名的内部类是可以的.如果您要添加额外的功能,我会使用命名类.我会让它成为一个嵌套类(即使用static修饰符) - 我发现它们更容易推理:)



4> Jeff Grigg..:

做最简单的事情可能有用:使用匿名内部类.

如果您以后发现需要更广泛的范围,那么重构代码以支持这一点.

(您可以对变量执行相同操作 - 将它们放在最具体的范围内.对其他源资产执行相同操作也是有意义的.)

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有