gpt4 book ai didi

java - 关于枚举的问题

转载 作者:行者123 更新时间:2023-11-29 10:06:15 24 4
gpt4 key购买 nike

如果我有一个对象

public class Genre {
private int id;
private int name;
}

并且id和name是事先确定好的,例如

if (id == 1)
name = "action";
else if (id == 2)
name = "horror";

我的问题是如何很好地创建这两个方法

Genre.getName(1); // return "action";
Genre.getId("action"); // return 1;

我想也许我可以使用枚举,比如

public enum Genre {
ACTION(1), HORROR(2);

private final int id;
private final String name;

private Genre(int id) {
this.id = id;
this.name = getName(id);
}

public int getId() {
return id;
}

public String getName() {
return name;
}

public static String getName(int i) {
switch(i) {
case 1 : return "action";
case 2: return "horror";
default :
return null;
}
}
}

但是这样一来,我就不知道怎么办了

Genre.getId("action"); // return 1;

恐怕我没有正确使用枚举。你能给我一些建议吗?谢谢!
---
首先,我想做的是在我的情况下,我想使用 id 或 name 来查找名称或 id,例如

int id = 1;
Genre.getName(id); // return "action"

String name = "action";
Genre.getId(name); // return 1

现在感谢所有的建议,我明白为什么我想做的是

int id = 1;
Genre.getGenre(id); // return Genre that id = 1 and the name = "action"

String name = "action";
Genre.getGenre(name); // return Genre that id = 1 and the name = "action"

最佳答案

如果你坚持为此使用枚举,你可以使用现有的枚举工具。下面的解决方案假定可以使用枚举名称和序号来代替您的名称和 ID 字段:

public enum Genre {

// ordinal 0, name = "ACTION"
ACTION,

// ordinal 1, name = "HORROR"
HORROR;
}

public static void main(String[] args) {

int horrorOrdinal = 1;
Genre horrorGenre = Genre.values()[horrorOrdinal];
String horrorName = horrorGenre.name();

String actionName = "ACTION";
Genre actionGenre = Genre.valueOf(actionName);
int actionOrdinal = actionGenre.ordinal();

System.out.println(String.format("%s=%s %s=%s", horrorName, horrorOrdinal, actionName, actionOrdinal));
}

输出:

HORROR=1 ACTION=0

另一种合适的方法是使用 map 进行查找,就像 Michał Šrajer 建议的那样:

private static Map<Integer, String> genres = new HashMap<Integer, String>();

public static void main(String[] args) {

initGenres();

int horrorOrdinal = 2;
String horrorName = genres.get(horrorOrdinal);

String actionName = "action";
int actionOrdinal = getGenreIdByName(actionName);

System.out.println(String.format("%s=%s %s=%s", horrorName, horrorOrdinal, actionName, actionOrdinal));
}

private static void initGenres() {
genres.put(1, "action");
genres.put(2, "horror");
}

private static int getGenreIdByName(String genreName) {
for (Entry<Integer, String> entry : genres.entrySet()) {
if (entry.getValue().equals(genreName)) {
return entry.getKey();
}
}
throw new IllegalArgumentException("Genre not found: " + genreName);
}

输出:

horror=2 action=1

设计注意事项:

在这个例子中,我选择对 id->name 使用(快速)映射查找,并编写了一个单独的方法 (getGenreIdByName) 来执行反向查找 name->id。您可以反过来,或使用第二张 map 来加快两次查找(代价是需要维护一张额外的 map )。

我选择在 map 中存储 id 和名称。您还可以使用 Genre 类本身作为 map 值。这将允许您稍后轻松添加额外的字段(如“描述”)。

如果您需要用不同的语言来表示您的流派,您可以使用 ResourceBundle 来本地化输出。在您的类路径根目录中创建一个语言文件。

在文件 genres_nl.properties 中:

horror=heel eng
action=actie

其中文件名中的 _nl 后缀表示语言。

然后在您的代码中,在 initGenres 中:

ResourceBundle genreNames = ResourceBundle.getBundle("genres", new Locale("nl");

获取流派名称时:

String horrorName = genreNames.getString(genres.get(horrorOrdinal));

请注意,如果找不到包,getString 会抛出运行时异常 MissingResourceException。为避免这种情况,请确保创建一个没有后缀的“默认”包(在本例中为名为“genres.properties”的文件),如果找不到所用区域设置的包,则会自动使用该文件。

关于java - 关于枚举的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7305400/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com