当前位置: 首页 > 面试题库 >

是否应该将Java中的静态嵌套类重构为单独的类?

艾子石
2023-03-14
问题内容

我继承了包含静态嵌套类的代码,如下所示:

public class Foo {

// Foo fields and functions
// ...
    private static class SGroup {
        private static Map<Integer, SGroup> idMap = new HashMap<Integer, SGroup>();

        public SGroup(int id, String type) {
// ...
        }
    }
}

通过阅读SO(例如Java内部类和静态嵌套类),我相信这等效于两个单独文件中的两个单独类:

 public class Foo {

    // Foo fields and functions
    // ...
}

public class SGroup {
    static Map<Integer, SGroup> idMap = new HashMap<Integer, SGroup>();

    public SGroup(int id, String type) {
// ...
    }
}

如果这是正确的,那么维护静态嵌套类结构是否有任何优势,还是应该重构?


问题答案:

Jorn陈述是正确的,通常按照以下经验法则来体现:

嵌套类应设为私有,这意味着保留托管类的辅助逻辑,仅此而已。如果您不能将它们设为私有,则可能不应嵌套。

例外是,当您定义嵌套类以允许轻松访问托管类的状态时,在这种情况下,您应该考虑简单地合并两个类以增加内聚性。



 类似资料:
  • 问题内容: 我正在查看Java代码,并注意到它使用了静态嵌套类。 使用静态嵌套类而不是普通内部类的原因是什么? 我能想到的唯一原因是Entry不能访问实例变量,因此从OOP的角度来看,它具有更好的封装性。 但是我认为可能还有其他原因,也许是性能。可能是什么? 注意。我希望我的术语正确,可以将其称为静态内部类,但是我认为这是错误的:http : //java.sun.com/docs/books/t

  • 问题内容: 我将Java转换为C#,并具有以下代码(请参阅JavaContext中有关其使用的讨论。一种方法可能是创建一个单独的文件/类,但是是否有C#idom保留了Java代码中的意图? 问题答案: 看看这个 http://blogs.msdn.com/oldnewthing/archive/2006/08/01/685248.aspx 我正在专门看 换句话说,Java内部类是C#无法使用的语法

  • 我打算从一个Java项目中提取几个类和包,并将它们放入另一个项目中(该项目将有一个可分发的jar)。这并不太难,但当然,进行如此大规模的重构会带来一些后果。也就是说,在原始项目中有许多类是我想要提取的类的子类。实现这种重构的最佳方法是什么?

  • 问题内容: 什么是静态嵌套类?静态和非静态嵌套类有什么区别? 问题答案: 静态内部类是嵌套在具有修饰符的另一个类中的类。除了可以访问在其内部定义的类的私有成员之外,它与顶级类几乎相同。 类是静态内部类。类是一个非静态的内部类。两者之间的区别是,非静态内部类的实例被永久连接到的实例-你不能创建一个没有。不过,您可以独立创建对象。 中的代码,并且都可以访问x; 不允许使用其他代码。

  • 问题内容: 考虑到内部循环满足条件,我循环遍历两个列表以填充最终列表。 我将代码重构为使用最新的Java 8流api,并提出了以下建议: 我如何才能进一步删除嵌套的foreach()方法? 问题答案: 通过与内部调用(从而使外部实例发生突变)而使用的问题是,如果有人并行旋转流并且集合不是线程安全的,则很容易遇到并发问题。 相反,您应该赞成适用于可变缩减的collect方法: 您可能还需要预先构建映

  • 问题内容: 至少在Java中,编译器不允许我将两个(或多个)单独的类放在一个类文件中。它迫使我在同一程序包中创建多个文件。我理解为什么会这样,并且我同意这一原则。但是,我已经意识到,我可以轻松地将类嵌套并在单个文件中包含整个程序(不包括导入的库)。我想这会被皱眉,但是我不明白为什么。与标准系统相比,嵌套类的危害和不利之处是什么(除了组织和整洁度的严重损失之外)? 问题答案: 好吧,如果将所有内容保