我有一个类,我们称之为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. } }
我不是匿名内部阶级的粉丝,因为坦率地说,我认为它看起来真的很难看.但是在一个仅在一个地方使用的子类的情况下,命名的内部类是否过度杀伤?什么是公认的做法?
匿名内部类的一个优点是没有人可以在其他地方使用它,而可以使用命名的内部类(如果只是由创建它的类(如果是私有的)).这是一个小小的区别,但它确实意味着您可以保护内部类别不被意外地用于其他地方.
此外,使用匿名内部类可以让任何人阅读您的代码 - "这个类正在这里使用,而不是其他任何地方." 如果你看到一个命名的内部类,有人可能会认为它会在类中的多个位置使用.
它们非常相似,所以这两点都不是改变游戏规则的.我认为如果你使用匿名内部类进行一次性操作,并且在类中多次使用它时命名内部类,我认为它有助于清晰.
(反对Daniel Lew)
匿名内部类的一个缺点是没有人可以在其他地方使用它,而可以使用命名的内部类(如果只是由创建它的类(如果是私有的)).这是一个小小的区别,但它确实意味着您可以帮助确保内部类不会在其他地方意外重新创建.
此外,使用匿名内部类可以让任何人阅读您的代码更加困难,因为他们必须解析这个无处不在的类.使用命名的内部类,您可以更多地组织源.
我见过有两个(或更多)匿名内部类具有完全相同代码的情况.特别是在GUI中(你可能有多个控件执行相同的操作),这可能会突然出现(我说的是生产代码,而不是我的学生编写的代码).
可读性问题是双向的,有些人发现匿名内部类更好,因为它可以让你看到一次发生的事情,其他人发现它分散了注意力.这部分归结为个人偏好.
如果你在一个实例中声明一个匿名的内部类,那么使一个类静态更有效,那么会有更多的开销,如果你不需要访问实例变量,那就浪费了(但可能不值得担心直到它出现问题).
我个人的偏好是使用非匿名类,因为它们可以在以后修改代码时提供更大的灵活性.
为什么需要将其子类化?如果它只是覆盖现有的虚方法,我认为匿名的内部类是可以的.如果您要添加额外的功能,我会使用命名类.我会让它成为一个嵌套类(即使用static
修饰符) - 我发现它们更容易推理:)
做最简单的事情可能有用:使用匿名内部类.
如果您以后发现需要更广泛的范围,那么重构代码以支持这一点.
(您可以对变量执行相同操作 - 将它们放在最具体的范围内.对其他源资产执行相同操作也是有意义的.)