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

Java枚举和具有私有构造函数的类之间有什么区别?

葛鸿轩
2023-03-14
问题内容

我试图了解Java枚举是如何工作的,我得出的结论是,它与将其构造函数声明为private的普通Java类非常相似。

我刚刚得出这个结论,它并不是基于太多的思考,但是我想知道我是否错过了任何事情。

因此,下面是一个简单的Java枚举和一个等效的Java类的实现。

public enum Direction {
    ENUM_UP(0, -1),
    ENUM_DOWN(0, 1),
    ENUM_RIGHT(1, 0),
    ENUM_LEFT(-1, 0);


    private int x;
    private int y;

    private Direction(int x, int y){
        this.x = x;
        this.y = y;
    }
    public int getEnumX(){
        return x;
    }
    public int getEnumY(){
        return y;
    }
}

上面和下面的代码在含义上有什么区别?

public class Direction{
    public static final Direction UP = new Direction(0, -1) ;
    public static final Direction DOWN = new Direction(0, 1) ;
    public static final Direction LEFT = new Direction(-1, 0) ;
    public static final Direction RIGHT = new Direction(1, 0) ;


    private int x ;
    private int y ;

    private Direction(int x, int y){
        this.x = x ;
        this.y = y ;
    }
    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    }
}

问题答案:

差异:

  1. 枚举扩展java.lang.Enum并获得其所有不错的功能:
    1. 通过正确的序列化自动实现单例行为
    2. .toString枚举值的自动可读方法,无需重复枚举名称
    3. .name.ordinal专用方法
    4. 可用于基于高性能的位集EnumSetEnumMap
  2. 枚举由以下语言专门处理:
    1. 枚举使用一种特殊的语法,简化了实例创建过程,而无需编写数十个public static final字段
    2. 枚举可以在switch语句中使用
    3. 枚举不能在枚举列表之外实例化,除非使用反射
    4. 枚举不能扩展到枚举列表之外
  3. Java自动将多余的东西编译成枚举:
    1. public static (Enum)[] values();
    2. public static (Enum) valueOf(java.lang.String);
    3. private static final (Enum)[] $VALUES;values()返回其副本)

可以使用适当设计的类来模拟其中的大多数,但这Enum实际上很容易创建具有这组特别理想的属性的类。



 类似资料:
  • 问题内容: 最近,我经常使用枚举。所以我想知道… 私有Enum构造函数和带有任何可见性修饰符(package-private)的枚举构造函数之间有什么区别吗? 问题答案: 根据java 文档 枚举类型的构造函数必须是程序包私有或私有访问。 但加入了JLS 如果没有为枚举类型的构造函数指定访问修饰符,则该构造函数为私有。 因此,package-private和private之间没有区别。

  • 问题内容: 由于枚举构造函数只能由其常量调用,因此为什么要允许它成为包私有的? 问题答案: 构造函数实际上不是包私有的…隐式地意味着接口方法是隐式的,即使您不添加关键字也是如此。 JLS(第8.8.3节)的相关部分规定: 如果没有为普通类的构造函数指定访问修饰符,则该构造函数具有默认访问权限。 如果没有为枚举类型的构造函数指定访问修饰符,则构造函数为。 如果枚举类型(第8.9节)的构造函数声明为或

  • 问题内容: 实用程序类的常见操作是为它们提供一个私有构造函数: 但不幸的是,某些工具不喜欢该私有构造函数。他们可能会警告说,它从来没有在类中被调用过,它没有被测试所覆盖,该块不包含注释,等等。 如果您改为执行以下操作,则许多警告将消失: 我的问题是:除了对未来开发人员的无休止的仇恨之外,没有值的枚举和Java中带有私有构造函数的类之间还有什么重要区别? 请注意,我 并不是在 问Java枚举与带有公

  • 或修饰符不允许与构造函数一起使用。为什么?我试过阅读标准文档,但没有很好地理解它。

  • 问题内容: 最终类与将类构造函数设为私有之间的区别到底是什么? 我知道两者都不能被子类化(如果我错了,请纠正我)。他们有什么不同吗? 问题答案: 期末课程无法扩展。它可以防止这种情况 这对于诸如String之类的事情很有用- 您不希望某人能够覆盖String(最常用的对象之一)的逻辑,并且能够(哦,我不知道)添加网络并发送所有返回您使用的字符串。如果可以扩展String,则可以这样做。 私有构造函

  • 问题内容: 在春季,bean的类可能没有公共构造函数,而只有私有构造函数吗?创建bean时会调用此私有构造函数吗?谢谢。 问题答案: 是的,Spring可以调用私有构造函数。如果找到具有正确参数的构造函数,无论可见性如何,它将使用反射将其构造函数设置为可访问的。