Java 枚举可以用作类吗?
我正在通读,看到一个正在使用的enum示例:Java 枚举可以用作类吗?,java,Java,我正在通读,看到一个正在使用的enum示例: public enum Planet { MERCURY (3.303e+23, 2.4397e6), VENUS (4.869e+24, 6.0518e6), EARTH (5.976e+24, 6.37814e6), MARS (6.421e+23, 3.3972e6), JUPITER (1.9e+27, 7.1492e7), SATURN (5.688e+26, 6.026
public enum Planet {
MERCURY (3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6),
JUPITER (1.9e+27, 7.1492e7),
SATURN (5.688e+26, 6.0268e7),
URANUS (8.686e+25, 2.5559e7),
NEPTUNE (1.024e+26, 2.4746e7);
private final double mass; // in kilograms
private final double radius; // in meters
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
private double mass() { return mass; }
private double radius() { return radius; }
// universal gravitational constant (m3 kg-1 s-2)
public static final double G = 6.67300E-11;
double surfaceGravity() {
return G * mass / (radius * radius);
}
double surfaceWeight(double otherMass) {
return otherMass * surfaceGravity();
}
public static void main(String[] args) {
if (args.length != 1) {
System.err.println("Usage: java Planet <earth_weight>");
System.exit(-1);
}
double earthWeight = Double.parseDouble(args[0]);
double mass = earthWeight/EARTH.surfaceGravity();
for (Planet p : Planet.values())
System.out.printf("Your weight on %s is %f%n",
p, p.surfaceWeight(mass));
}
}
公共枚举行星{
水银(3.303e+23,2.4397e6),
金星(4.869e+24,6.0518e6),
接地(5.976e+24,6.37814e6),
火星(6.421e+23,3.3972e6),
木星(1.9e+27,7.1492e7),
土星(5.688e+26,6.0268e7),
天王星(8.686e+25,2.5559e7),
海王星(1.024e+26,2.4746e7);
私人最终双质量;//单位为千克
专用最终双半径;//以米为单位
行星(双质量,双半径){
这个质量=质量;
这个半径=半径;
}
私有双质量(){return mass;}
专用双半径(){return radius;}
//通用重力常数(m3 kg-1 s-2)
公共静态最终双G=6.67300E-11;
双表面整体性(){
返回G*质量/(半径*半径);
}
双曲面灯光(双质量){
返回其他质量*表面间隙();
}
公共静态void main(字符串[]args){
如果(args.length!=1){
System.err.println(“用法:JavaPlanet”);
系统退出(-1);
}
双倍重量=double.parseDouble(args[0]);
双质量=土壤重量/土壤表面完整性();
对于(行星p:Planet.values())
System.out.printf(“您在%s上的重量是%f%n”,
p、 p.表面光(质量);
}
}
我一直认为枚举是通常在类之外使用的相关常量集,但本例显示了使用枚举时,它就像使用类一样,有自己的方法和构造函数。我知道它是一个枚举,因为类声明中有“enum”。枚举可以像类一样使用吗?如果类和枚举如此相似,它们之间的区别是什么?对于像标准类一样工作的枚举,有哪些好的用途
谢谢枚举和标准类之间的主要区别在于限制:枚举的所有实例都必须在编译时声明;所有字段都必须是最终字段,并且类不能扩展。枚举和标准类之间的主要区别在于限制:枚举的所有实例都必须在编译时声明;所有字段都必须是final,并且类不能扩展。enum关键字是一种语言构造,它本质上创建了一个(final)类,该类扩展了
java.lang.enum
,并强制您在enum定义中预先定义所有命名实例(可能为空)集。
所以答案肯定是肯定的;事实上,你不能用其他任何方式来使用它
即使不向其添加任何逻辑,它仍然是类:
enum Day { SUNDAY, MONDAY... }
这已经为您提供了静态方法,如
Day.valueOf()
和实例方法,如Day.SUNDAY.ordinal()
、name()
或compareTo()
关键字enum
是一种语言构造,它本质上创建了一个(最终的)关键字类,该类扩展了java.lang.Enum
,并强制您在枚举定义中预先定义所有命名实例(可能为空)集。
所以答案肯定是肯定的;事实上,你不能用其他任何方式来使用它
即使不向其添加任何逻辑,它仍然是类:
enum Day { SUNDAY, MONDAY... }
这已经为您提供了静态方法,如
Day.valueOf()
,以及实例方法,如Day.SUNDAY.ordinal()
,name()
或compareTo()
如果您想将enum作为一个类使用,可以按以下方式使用它
public class Weather {
public enum Season {
WINTER,
SPRING,
SUMMER,
FALL
}
private final Season season;
private static final List < Weather > listWeather = new ArrayList < Weather > ();
private Weather(Season season) {
this.season = season;
}
public Season getSeason() {
return season;
}
static {
for (Season season: Season.values()) {
listWeather.add(new Weather(season));
}
}
public static ArrayList < Weather > getWeatherList() {
return listWeather;
}
public String toString() {
return season;
}
}
公共类天气{
公众普查季节{
冬天
春天
夏天,
落下
}
私人决赛季;
私有静态最终列表listWeather=newarraylist();
私人天气(季节){
这个季节=季节;
}
公众季节{
回归季节;
}
静止的{
用于(季节:季节.值()){
添加(新天气(季节));
}
}
公共静态数组列表getWeatherList(){
回归天气;
}
公共字符串toString(){
回归季节;
}
}
如果您想将enum作为一个类使用,可以按以下方式使用它
public class Weather {
public enum Season {
WINTER,
SPRING,
SUMMER,
FALL
}
private final Season season;
private static final List < Weather > listWeather = new ArrayList < Weather > ();
private Weather(Season season) {
this.season = season;
}
public Season getSeason() {
return season;
}
static {
for (Season season: Season.values()) {
listWeather.add(new Weather(season));
}
}
public static ArrayList < Weather > getWeatherList() {
return listWeather;
}
public String toString() {
return season;
}
}
公共类天气{
公众普查季节{
冬天
春天
夏天,
落下
}
私人决赛季;
私有静态最终列表listWeather=newarraylist();
私人天气(季节){
这个季节=季节;
}
公众季节{
回归季节;
}
静止的{
用于(季节:季节.值()){
添加(新天气(季节));
}
}
公共静态数组列表getWeatherList(){
回归天气;
}
公共字符串toString(){
回归季节;
}
}
一个枚举
非常像一个普通的类,不同的是实例是在编译时定义的,并且保证是单例的,它们可能不会扩展任何东西
但是,他们可以:
- 有实例字段,可能是最终的,也可能不是(尽管在常规用法中它们是不可变的,但不是必需的)
- 具有类(
)字段(尽管它们必须在实例之后声明)静态
- 有字段的getter/setter
- 有构造器(但不是公共构造器)
- 实现接口
- 用注解装饰
枚举
非常像一个普通的类,不同的是实例是在编译时定义的,并且保证是单例的,它们不能扩展
任何东西
但是,他们可以:
- 有实例字段,这可能是最终的,也可能不是(尽管在常规用法中它们是i)