我想这样做,所以当我调用新的Objectives(新的Runnable(),"在这里命名",int x,int y,int z)时我可以放置定义的整数但是我似乎无法去做吧。再次,当调用新的目标和位置
时,ENUMS中的整数将被放置在那里到目前为止,这是我的代码:
package me.terturl.com.Objectives;
public enum Objectives {
MECH(new Runnable() {
@Override
public void run() {
}
}, "Mech", Location loc, int x, int y, int z);
private String name;
private Location loc;
private int x;
private int y;
private int z;
public objectives(Runnable run, String name, Location loc, int x, int y, int z) {
this.name = name;
this.loc = loc;
this.x = x;
this.y = y;
this.z = z;
}
public String getName() {
return name;
}
public Location getLoc() {
return loc;
}
}
答案 0 :(得分:1)
所有enum
都是常量。您无法为enum
的新实例指定参数。相反,使用类根据给定的参数构造新对象。
使用中enum
的示例:
enum WeekDay { MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(0); public final int id; WeekDay(int id){ this.id = id; } }
可能用于此案例的class
示例:
package me.terturl.com.Objective;
import org.bukkit.Location;
public class Objective {
private String name;
private Location loc;
private int x, y, z;
Objective(Runnable run, String name, Location loc, int x, int y, int z) {
this.name = name;
this.loc = loc;
this.x = x;
this.y = y;
this.z = z;
}
public String getName() { return name; }
public Location getLoc() { return loc; }
}
修改:所有 enum
隐式延长java.lang.Enum
。由于Java不支持多重继承,因此enum
无法扩展其他任何内容。因此,enum
将无法实现您所寻找的目标 - 存储目标的详细信息。而是使用上面的类并创建 Manager Class 来处理您的目标。
但是,如果适用,enum
可以implement
interfaces
:
interface MajorObjectWrapper{
public Object getMajorObject();
}
enum Utility implements MajorObjectWrapper {
VAULT("Gold"),
//...
LOCK(new Lock());
@Override public Object getMajorObject(){ return obj; }
private Object obj;
Utility(Object obj){ this.obj=obj };
}
{
MajorObjectWrapper wrapper=Utility.VAULT;
System.out.println(wrapper.getMajorObject());
// You will get: "Gold"! :)
}
implement
interface
与enum
s。指定者:
http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
PS:您的包声明会生成类me.terturl.com.Objectives.Objectives
的绝对路径。考虑将包声明重构为me.terturl.com
或me.terturl.com.objectives
。语义:)
答案 1 :(得分:0)
我认为enum
不是你想要的。来自Oracle Java教程的enum
页面here:
枚举类型是一种特殊的数据类型,它使变量成为一组预定义的常量。
常数。因此,制作新实例确实没有意义。这也是在语言层面强制实施的。 JLS第8.9.2节:
如果枚举声明中的构造函数声明是公共的或受保护的(第6.6节),则是编译时错误。
在枚举声明中,没有访问修饰符的构造函数声明是私有的。
所以这是你的第一个问题。你不能拥有public
枚举构造函数。
其次,你有点误解了枚举常量构造函数的工作原理。当你做
之类的事情MECH(...)
您实际上是调用构造函数。你不能在构造函数调用中执行int x
之类的操作。你会像任何其他构造函数一样对待它,这意味着要么在那里进行方法调用,要么在其他表达式中进行求值。你的前两个参数是可以的,但其余的参数不是那么多。
例如,如果我想制作new String()
,我就不能这样做:
String s = new String(String putStringHere);
类似的逻辑适用于您的代码。
老实说,我有点困惑你为什么要使用enum
。对我来说就像一个普通的老班级会做得很好。
(也可能是一个错字,但你的构造函数应该大写)