我试图创建一个对象构建器,我的枚举常量可以用于一些简单的游戏内项目管理。但是,在使用构建器时,任何返回的类实例都充当"这个"在文字上下文中,由于以下错误,我无法使用它:
非静态变量'这个'无法从静态上下文引用
为什么我的代码在私有类返回自己的实例时会尝试使用枚举本身的实例?
public enum PrisonItem {
/* Example of an enum constant */
STUN_STICK(new ItemStackBuilder().setName("&bNightstick").setType(Material.STICK).setAmount(1).build());
/* Enum instance methods */
private final ItemStack item;
private PrisonItem(ItemStack item) {
this.item = item;
}
public ItemStack getItem() {
return this.item.clone();
}
/* Builder for item creation within the enum */
private class ItemStackBuilder {
/* Fields representing aspects of the child object */
protected String name;
protected List<String> lore = new ArrayList<>();
protected Map<Enchantment, Integer> enchantments = new HashMap<>();
protected Material type;
protected int amount;
/* Setters */
public ItemStackBuilder setName(String name) {
this.name = ChatColor.translateAlternateColorCodes('&', name);
return this;
}
public ItemStackBuilder addLore(String lore) {
this.lore.add(ChatColor.translateAlternateColorCodes('&', lore));
return this;
}
public ItemStackBuilder addEnchantment(Enchantment ench, int level) {
this.enchantments.put(ench, level);
return this;
}
public ItemStackBuilder setType(Material type) {
this.type = type;
return this;
}
public ItemStackBuilder setAmount(int amount) {
this.amount = amount;
return this;
}
/* Builder */
public ItemStack build() {
if (this.type == null || this.amount < 0 || this.amount > 64) {
throw new IllegalArgumentException("Illegal fields in " + this.getClass().getName() + "!");
}
ItemStack back = new ItemStack(this.type);
back.setAmount(this.amount);
ItemMeta meta = Bukkit.getItemFactory().getItemMeta(this.type);
meta.setDisplayName(this.name);
meta.setLore(this.lore);
back.setItemMeta(meta);
back.addEnchantments(this.enchantments);
return back;
}
}
}
然而,当ItemStackBuilder
类被分离并放入其自己的公共类时,这似乎工作正常。这对我来说似乎是不合逻辑的,因为这个类只被这个枚举使用过,作为一个嵌套的类,它不应该作为一个我想象的整体作用吗?
答案 0 :(得分:2)
ItemStackBuilder类不是静态的。这意味着任何实例都必须与父类关联。您正在尝试从外部枚举类的静态初始化创建它,我相信这是导致您的问题的原因。将ItemStackBuilder更改为静态,您的问题应该消失。
答案 1 :(得分:0)
你的ItemStackBuilder
是内部类(类中的类)的一个例子。
这些类本身不能自己实例化,它们必须通过外部类的对象进行实例化。
例如:
public class ClassA {
public class ClassB {
}
}
你可以这样做:
objA = new ClassA();
但不是:
objB = new ClassB();
然而:
objA = new ClassA();
objB = objA.new ClassB();
会像魅力一样发挥作用。
有关此主题的更多信息:http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html 或任何有关内部和嵌套类章节的java书籍。
希望它有所帮助。