私有嵌套静态类 - 是好的还是不好的实践?

19

将私有静态类嵌套在非静态类中是否被认为是一种不良实践?

public class Outer
{
    private static class Inner
    {


    }
}

这里的想法是所有 'Outer' 的实例都可以共同访问静态状态。另一种方法可能是只让 Inner 类非静态,并使用其静态实例:

public class Outer
{
    private static innerInstance = new Inner(); 

    private class Inner
    {


    }
}

类似的效果。这种方法有哪些优点/缺点或其他需要考虑的因素?

我必须承认,我几乎从不使用嵌套类,无论是静态还是非静态的,但我对这个特定的概念很感兴趣。


静态类在不需要访问外部类成员时更有效率。因此,Linkedlist.java中的Node是静态的。请查阅《Effective Java》。 - JavaDeveloper
6个回答

24

这两种方法都是完全有效的。

我希望开发人员更经常使用私有嵌套类,结合 c# 的 partial 关键字使用,可以使编写非常复杂的类更易于维护。想象一下需要构建一个具有小型应用程序复杂度的类 - 当你实际上可以构建一个完整的私有应用程序时,外部类就变得更加容易处理了!

我见过的一个非常常见的情况是 可枚举对象 - 这些对象可能会非常复杂,特别是在开始构建可以链接的自定义迭代器(如 LINQ)时。将复杂性隐藏在单个类内部正是封装的明确体现。


5

如果该类在多线程应用程序中使用,则可能需要通过锁定来控制对静态状态的访问。无论私有嵌套还是不是,这都是静态状态的问题。


3
想象一下需要构建一个具有小型应用程序复杂度的类...其中的类都完全是您复杂外部类的内部类。
不,不要想象这种情况。
即使是小型应用程序,也不要构建具有应用程序复杂度的类。
这样做实际上会增加复杂性。
使用单独的类,每个类理想情况下只承担一个职责。
这是减少复杂性的方法。

3

原则上没有问题,但是如果你希望嵌套静态类来帮助组织静态状态或方法,那么这可能是一个警告信号,表明该类正在变得过于庞大。嵌套私有类有许多用途(内部数据结构、传出私有接口的私有实现等),但静态私有类实际上只是一种将事物分组的方式。


2

这要看 Inner 类是做什么的。如果只是一个实用工具类,那么使用静态内部类是一个好方法。

public class Calculator
{
    private static class HexToDecUtils
    {
        // converter code here
    }
}

在另一方面,如果Inner类与其他对象组合在一起,它就不应该是静态类。
public class Car
{
    private class Engine
    {
        // your code here
    }
}

2

这没有任何问题,也没必要有什么问题。

范围是有限的,只有外部类的实例才能访问它,这是一个很好的地方放置常量和其他私有于外部类功能的公共功能,而不必一直实例化它。

我认为这只是很好的做法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接