繁体   English   中英

如何在枚举中存储不同的类?

[英]How can I store different classes in an enum?

我有一个枚举EnumUtil和几个类ChatUtil,PrefixUtil等。 ChatUtil和PrefixUtil类扩展了Util类。 我需要的是一种将它们存储在枚举中的方法。

例:

我有一个需要前缀的类,因此我将调用Enumutil.PREFIX_UTIL,并且它将返回PrefixUtil类。

这是我的代码,我认为它不起作用:

public enum EnumUtil
{
    CHAT_UTIL(My ChatUtil classfile),
    PREFIX_UTIL(My PrefixUtil classfile);

    private final Class<? extends Util> classFile;
    private EnumUtil(Class<? extends Util> file)
    {
        this.classFile = file;
    }

    public Class get()
    {
        return this.classFile;
    }
}

我知道这肯定行不通,因为它总是返回EnumUtil。 另外,我需要提一下,我不知道如何正确使用枚举。 我看过许多教程,但对于此类问题我都没有找到。

这是实际的代码,我所做的就是用My ChatUtil类替换“ ChatUtil.class”(无实际引号)。

因此,它看起来如下所示:

CHAT_UTIL(ChatUtil.class),PREFIX_UTIL(Prefixes.class); 这就是我所说的枚举:

前缀前缀= EnumUtil.PREFIX_UTIL; 这是我收到的错误:

不兼容的类型:EnumUtil无法转换为前缀

编辑:

我将通过让Util处理它回到旧方法。 它既有效又有效。

感谢您的意见和建议!

Prefixes prefix = EnumUtil.PREFIX_UTIL;

应该

Prefixes prefix = EnumUtil.PREFIX_UTIL.get().newInstance();

但这是完全没有意义的。 您已经在调用站点对类名进行了编码,这就是您要避免的说法。 您可以将newInstance()放在get()方法内,但是它将返回什么呢? 它必须返回Object,所以您必须编写

Prefixes prefixes = (Prefixes)EnumUtil.PREFIX_UTIL.get();

情况越来越糟,类名在调用站点被编码两次 你最好写

Prefixes prefixes = Prefixes.class.newInstance();

或确实

Prefixes prefixes = new Prefixes();

就像其他人一样

它应该工作。 this.classfile引用枚举中提供的类文件。 因此EnumUtil.CHAT_UTIL.get()将返回“我的chatutil类文件”。 但是,get()始终会返回Class对象,这对我来说似乎毫无意义。

我想你想要这样的东西。

public enum EnumUtil {
    CHAT_UTIL(ChatUtil.class),
    PREFIX_UTIL(PrefixUtil.class);

    private Class<? extends Util> clazz;
    private EnumUtil(Class<? extends Util> clazz){
        this.clazz = clazz;
    }
    public Class<? extends Util> getClazz() {
        return clazz;
    }
    public Util getUtil() throws InstantiationException, IllegalAccessException {
        return clazz.newInstance();
    }

}

public class Util {

}

public class ChatUtil extends Util {

    @Override
    public String toString() {
        return "ChatUtil [getClass()=" + getClass() + "]";
    }

}

public class PrefixUtil extends Util {

    @Override
    public String toString() {
        return "PrefixUtil [getClass()=" + getClass() + "]";
    }

}

public class Test {

    /**
     * @param args
     * @throws IllegalAccessException 
     * @throws InstantiationException 
     */
    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        System.out.println(EnumUtil.CHAT_UTIL);
        System.out.println(EnumUtil.PREFIX_UTIL);
        System.out.println(EnumUtil.CHAT_UTIL.getUtil());
        System.out.println(EnumUtil.PREFIX_UTIL.getUtil());
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM