public enum Dictionaries {
FIRST_DICTIONARY(FirstDictionary.class),
SECOND_DICTIONARY(SecondDictionary.class);
private Class<? extends DictionaryModel> clazz;
private Dictionary(Class<? extends DictionaryModel> clazz) {
this.clazz = clazz;
}
public Class<? extends DictionaryModel> clazz() {
return this.clazz;
}
}
我有这个枚举。 FirstDictionary
和SecondDictionary
实施DictionaryModel
,它是一个标记界面,以便使用此解决方案。
现在我很乐意这样做:
Class<FirstDictionary> clazz = Dictionaries.FIRST_DICTIONARY.clazz();
这种设计显然不可能,我无法想到实现这一目标的方法。有没有办法做到这一点?我可以访问整个代码,因此我可以修改所有内容,包括界面(甚至删除它)。
我简化了所有这一点,重点是每个字典都是一个数据库表,我有一个共同的DAO(而不是每个字典的DAO),现在我必须转换每个读取的结果我想要避免。我知道常见的DAO不是一个好主意(或DAO)。
Optional<DictionaryModel> entity = dao.getByValue(Dictionaries.FIRST_DICTIONARY, value);
在DAO本身或clazz()
方法中,即使对于任何动态转换,我也似乎无法做到。我觉得我在这里遗漏了一些明显的东西。
我很欣赏任何想法,甚至完全改变设计。
答案 0 :(得分:4)
目前无法使用枚举。您提供的示例也在JEP 301中提供:
enum Argument<X> { // declares generic enum
STRING<String>(String.class),
INTEGER<Integer>(Integer.class), ... ;
Class<X> clazz;
Argument(Class<X> clazz) { this.clazz = clazz; }
Class<X> getClazz() { return clazz; }
}
Class<String> cs = Argument.STRING.getClazz(); //uses sharper typing of enum constant
但目前这不是语言的一部分
在此之前,您必须重构代码才能使用类,例如:
interface DictionaryModel {}
class FirstDictionary implements DictionaryModel {}
class SecondDictionary implements DictionaryModel {}
// Following a model similar to how enums are implemented, but with sharper typing:
abstract class Dictionaries<T extends DictionaryModel> {
public static final Dictionaries<FirstDictionary> FIRST_DICTIONARY
= new Dictionaries<>(FirstDictionary.class) {};
public static final Dictionaries<SecondDictionary> SECOND_DICTIONARY
= new Dictionaries<>(SecondDictionary.class) {};
private final Class<T> clazz;
private Dictionaries(Class<T> clazz) {
this.clazz = clazz;
}
public Class<T> clazz() {
return this.clazz;
}
}
现在你可以这样:
Class<FirstDictionary> clazz = Dictionaries.FIRST_DICTIONARY.clazz();
答案 1 :(得分:4)
由于explained by Jorn Vernee,enum
类型不允许这样做。
最简洁的解决方案,允许您编写类似
的内容Class<FirstDictionary> clazz = Dictionaries.FIRST_DICTIONARY.clazz();
将是
public interface Dictionaries<T extends DictionaryModel> {
Dictionaries<FirstDictionary> FIRST_DICTIONARY = () -> FirstDictionary.class;
Dictionaries<SecondDictionary> SECOND_DICTIONARY = () -> SecondDictionary.class;
Class<T> clazz();
}
但您可以协调getByValue
是否真的需要接收enum
常量作为参数,而不是首先接受Class<T extends DictionaryModel>
。