java - 内部枚举或类是否有效?

标签 java performance enums inner-classes

我经常看到人们使用内部枚举,例如:

public class Person {
  enum Gender {
    MALE,
    FEMALE,
    OTHER
  }
  ...
}

我不确定它在内部是如何工作的,所以我想知道每次有人创建一个新人时是否会有这个枚举类的新实例,例如 new Person()

内部枚举会继续消耗更多内存还是只会有一个?


跟进: 只需在代码编辑器(Java 11)中对接受的答案进行快速测试:

public class Person {
    String name;
    int Age;
    Address address = new Address();//Usual way we see
    public class Address {
        String city;
        String Country;
        int number;
    }
}

public class test {
    public static void main(String[] args) {
        var a = new Person.Address();//complains "innerclass.Person' is not an enclosing class, make Address Static"
        var p = new Person();
        var a1 = p.new Address();//correct syntax to create inner clas object outside its outer class
    }
}

TBH,永远不要期望创建内部类对象的语法如此奇怪。但是考虑到我们通常只是在外部类中使用它,就像迭代器在不同数据结构中的使用方式一样,我对此感到奇怪还是有道理的。 最后,内部类对象根据实际需要创建,依赖外部类,不存在效率问题


关于@Zabuzard 和@user207421 之间的讨论,他们都提出了一个很好的观点。 user207421 指出类只有在非静态时才被认为是内部类。枚举和记录本质上是静态的:Oracle doc .从根本上学习是好的。但我很欣赏 Zabuzard 如何以一种我们可以从头开始轻松理解的方式解释一切。

最佳答案

解释

嵌套枚举本质上是静态嵌套类。它们不属于外部类的实例。

无论你创建了多少人,你总是只有一个单例 enum Gender float ,仅此而已。

它的值也一样,这个枚举只有 3 个值——不管你创建了多少人。

内部类

但是,即使你有一个内部(非静态)类,比如

class A {
  class B { ... }
  ...
}

你将只有一个类 B 在内存中(如你所说)。本质上总是只有一个类。

现在,当您创建 B 的实例时,您必须基于先前创建的 A 实例来创建它们,因为 B 的实例code> 现在属于 A 的实例,并且只能存在于它们的上下文中。

因此,它们还共享特定 A 实例的非静态属性。你会经常看到它被用于数据结构的 Iterator 实现。

静态嵌套与解耦

如果你有一个静态嵌套类,比如

class A {
  static class B { ... }
}

您可能会问真正完全解耦它们的唯一真正区别是什么,如

class A { ... }
class B { ... }

嵌套清楚地表明它们在主题方面以某种方式彼此属于。一个例子是 Map 中的 Entry 类。


效率注意事项

您实际上应该停止在那些小事上担心效率。相反,请考虑读者的可读性

按照您的想法,效率很少成为一个因素。如果,通常只在整个代码库中的非常小的地方(通常使用分析器识别)。

所以基本上,除非您有充分的理由不这样做,否则请始终努力最易读和最易理解的解决方案。

关于java - 内部枚举或类是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72878966/

相关文章:

java - Apache CXF - 阐明 wsdl 生成错误

performance - 使用 CLRS 代码和 Robert Sedgewick 代码进行插入排序的运行时间差异

java - 无法仅为 Enum 创建通用 javax validator

java - 将对象的值与枚举的值进行比较

单击 jButton 时 Java GUI 卡住

java - 没有找到合适的方法

java - 是否可以执行可运行的 JAR 并将其作为调用它的同一进程的一部分运行?

c++ - 跳过 list ,他们的表现真的和Pugh Paper所说的一样好吗?

javascript - jQuery - 当点击元素太快时动画会出现问题

Scala-Play 表单 : Cannot find Formatter type class for Enumeration subtype