java enum getter转换为int时出错

时间:2016-05-24 22:18:33

标签: java enums casting

所以我在这里阅读了一些关于stackoverflow的文章,觉得我大部分时间都在工作,但他们通常没有关于如何使用getter / setter的例子

我非常接近搞清楚这个问题,只是很难搞清楚最后一部分

目前我正在使用的程序中的所有商店都使用openShop(id);但我希望能够使用openShop(" GENERAL_STORE");因为这样可以更容易维护,更容易看到,而无需查找ID。

任何想法我做错了什么?

private enum shopName {
    GENERAL_STORE(577);

    private final int id;
    shopName(int id) {
        this.id = id;
    }
    public int getId() {
        return this.id;
    }
};

public void openShop(String name) {
    int shopId = shopName(name).getId(); //line with error
    //int shopId = shopName.shopName(name).getId(); //I've also tried this
    openShop(shopId);
}
public void openShop(int id) {
    /* blah */
}

以下是错误

$ ./compiler.sh
file.java:#: error: cannot find symbol
    int shopId = shopName(name).getId();
                 ^
  symbol:   method shopName(String)
  location: class File
1 error

2 个答案:

答案 0 :(得分:5)

shopName(name)没有按照您的想法行事。此代码尝试调用方法shopName并将name作为参数传递,但您没有这样的方法。

如果您希望根据提供的名称获取shopName枚举使用shopName.valueOf(name)。所以你的代码可能应该是这样的:

int shopId = shopName.valueOf(name).getId();

另请注意,如果您不提供正确的名称,此方法将抛出IllegalArgumentException

此外,枚举被视为 type ,因此其名称应该像其他Java(非原始)类型一样以大写字母开头。因此,将shopName更改为ShopName

答案 1 :(得分:1)

您说openShop("GENERAL_STORE")更易于维护,但openShop(ShopName.GENERAL_STORE)(或更短的openShop(GENERAL_STORE))更易于维护,因为编译器会捕获拼写错误。

这是枚举的主要目的之一。

public enum ShopName {
    GENERAL_STORE(577);

    private final int id;
    private ShopName(int id) {
        this.id = id;
    }
    int getId() {
        return this.id;
    }
};

public void openShop(ShopName name) {
    openShop(name.getId());
}
public void openShop(int id) {
    /* blah */
}