Bukkit - 获取为什么枚举不起作用的解释

时间:2014-06-13 06:03:30

标签: java enums bukkit

我想这样做,所以当我调用新的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;
}

}

2 个答案:

答案 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"! :)
}
  • 感谢 @nrubin29 引用implement interfaceenum s。
  

指定者:

     

http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

PS:您的包声明会生成类me.terturl.com.Objectives.Objectives的绝对路径。考虑将包声明重构为me.terturl.comme.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。对我来说就像一个普通的老班级会做得很好。

(也可能是一个错字,但你的构造函数应该大写)