Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匿名与命名内部类最佳实践?_Java_Oop_Class_Inheritance_Anonymous Class - Fatal编程技术网

Java 匿名与命名内部类最佳实践?

Java 匿名与命名内部类最佳实践?,java,oop,class,inheritance,anonymous-class,Java,Oop,Class,Inheritance,Anonymous Class,我有一个类,我们称之为LineGraph,它呈现一个线图。我需要对它进行子类化,但是派生类只在一个地方使用,并且与使用它的类耦合。所以我使用了一个内部类 我认为有两种方法可以做到这一点: 匿名内部类 public class Gui { LineGraph graph = new LineGraph() { // extra functionality here. }; } public class Gui { MyLineGraph graph = n

我有一个类,我们称之为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.
    }
}
命名内部类

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.
    }
}

我不是匿名内部类的粉丝,因为坦率地说,我只是觉得它看起来很难看。但是对于只在一个地方使用的子类,命名的内部类是不是太过了?公认的做法是什么?

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

我认为在这种情况下,您所做的非常有意义,无论从哪个角度看,我认为您对这个特定问题的看法都是错误的。匿名内部类的一个优点是,任何人都不能在其他任何地方使用它,而命名的内部类则可以使用(如果仅由创建它的类专用的话)。这只是一个小小的区别,但它确实意味着您可以保护内部类不被意外地用于其他地方

此外,使用匿名内部类会让任何阅读您的代码的人都大吃一惊——“这个类只在这里使用,其他地方都没有。”如果您看到一个命名的内部类,有人可能会认为它会在类中的多个位置使用


他们非常相似,所以这两点都不是游戏规则的改变者。我只是认为,如果一次性使用匿名内部类,并且在类中多次使用时使用命名内部类,这将有助于澄清问题。

我认为这是一个品味问题。我更喜欢使用匿名类。但在您的情况下,我会使用一个内部类,因为我认为您将在其中打包的不仅仅是几行代码,可能不仅仅是一个方法。它将强调这样一个事实,即它通过将超类放入类中而不是隐藏在方法中的某个地方来向超类添加功能。另外,谁知道呢,也许有一天你会在别的地方需要这个子类。当然,这取决于您对软件将如何发展的了解程度。除此之外,抛硬币就行了。:)

匿名内部类在Eclipse中很难调试(我就是这么用的)。您将无法通过简单的右键单击查看变量值/注入值。

匿名内部类通常是一种方法。我觉得它们可读性很强。但是,如果该类的实例需要序列化(即使只是因为它是其他类的字段),我强烈建议使用命名的内部类。字节码中匿名内部类的名称很容易更改,这会破坏序列化。

(指向Daniel Lew)

匿名内部类的一个缺点是,任何人都不能在其他任何地方使用它,而命名的内部类可以使用(如果仅由创建它的类专用)。这是一个很小的区别,但它确实意味着您可以帮助确保内部类不会意外地在其他地方重新创建

此外,使用匿名内部类会让任何阅读您的代码的人更加困难,因为他们必须解析这个不知从何而来的类。使用一个命名的内部类,您可以更有效地组织源代码

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

可读性问题是双向的,一些人发现匿名内部类更好,因为它让你看到在一个地方发生了什么,其他人发现它分散了注意力。这部分归结为个人偏好

另外,使类成为静态的效率更高,如果在实例中声明一个匿名内部类,那么会有更多的开销,如果不需要访问实例变量,这是浪费(但在出现问题之前可能不值得担心)


我个人的偏好是使用非匿名类,因为它们允许在以后修改代码时具有更大的灵活性。

内部类的缺点是它们不能是静态的。这意味着将保存对包含它们的外部类的引用

非静态内部类可能是一个问题。例如,我们最近有一个内部类正在序列化,但外部类不可序列化。隐藏的引用意味着外部类也将被序列化,这当然失败了,但需要一段时间才能找到原因


在我工作的地方,我们的编码最佳实践(如果可能)鼓励静态内部类,因为它们携带的隐藏行李更少,而且更精简。

我对简单的匿名类没有问题。但是,如果它由多行代码或多个方法组成,则内部类更清晰。我还认为,在某些情况下,它们永远不应该被使用。例如,当它们必须返回数据时

我看到过这样的代码:最后一个1项数组用于将数据从调用传递回匿名内部类。在anon类的方法中,设置单个元素,然后在方法完成后提取此“结果”。有效但丑陋的代码。

:使用匿名内部类

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


(对变量也可以这样做——将它们放在最特定的范围内。对其他源资产也可以这样做。)

我个人的经验法则:如果