我试图了解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;
}
}
差异:
java.lang.Enum
并获得其所有不错的功能:
.toString
枚举值的自动可读方法,无需重复枚举名称.name
和.ordinal
专用方法EnumSet
和EnumMap
类public static final
字段switch
语句中使用public static (Enum)[] values();
public static (Enum) valueOf(java.lang.String);
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可以调用私有构造函数。如果找到具有正确参数的构造函数,无论可见性如何,它将使用反射将其构造函数设置为可访问的。