gpt4 book ai didi

Java基于枚举类型创建对象的方法

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

我的课是这样的:

class X {}
class Y extends X {};
class Z extends X {};

每个子类(id + 类)都有一个枚举:

enum Type {
Y_TYPE(1, Y.class), Z_TYPE(2, Z.class);
int id;
Class c;
public Type(int id, Class c) { this.id = id; this.c = c; }
public static X createInstance() throws Exception {
return c.newInstance();
}
}

然后我按如下方式使用它们:

X parseFromID(int id) {
for (Type v : Type.values()) {
if (v.id == id) {
return v.createInstance();
}
}
}

它工作正常,但我想知道这是否是一种基于整数 id 创建数据的 Java 主义方式?有什么不好的东西要找吗?

有没有一种方法可以强制传入的类是 X 类型,而无需冗长的 if-else 条件?想想当我有大量的子类。


Why do you want to work on integer ids?

我正在编写某种解析器,所以我需要将从某处获取的整数 id 转换为适当的对象。

最佳答案

这里真的没有理由使用反射。 Throwing Exception 也是一种不好的做法,如果你不使用反射,你就不必处理反射异常。你可以简单地做

enum Type {
Y_TYPE(1) {
@Override
public X createInstance() {
return new Y();
}
}, Z_TYPE(2) {
@Override
public X createInstance() {
return new Z();
}
};

private int id;

private Type(int id) {
this.id = id;
}

public abstract X createInstance();
}

这也很有用,因为它不会强制每个子类都有一个公共(public)的无参数构造函数,并且如果可能的话还允许返回相同的 X 或 Y 实例。

如果您担心匿名类定义的冗长,如果您使用的是 Java 8,则可以将它们替换为 lambda:

import java.util.function.Supplier;

enum Type {
Y_TYPE(1, X::new), Z_TYPE(2, Y::new);

private int id;
private Supplier<X> supplier;

private Type(int id, Supplier<X> supplier) {
this.id = id;
this.supplier = supplier;
}

public X createInstance() {
return supplier.get();
}
}

关于Java基于枚举类型创建对象的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30924172/

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