Java 我应该在这里使用枚举吗?

Java 我应该在这里使用枚举吗?,java,enums,Java,Enums,我有一个名为ColorConstants的类,它只是一个定义了在整个应用程序中使用的大量公共静态最终颜色字段的类,使更改颜色方案等变得容易。我想做的是有两个方案:反转,而不是反转。我想设置这个类,以便根据方案/主题,相同的字段名可以引用不同的颜色。而不是每次都检查/获取必要的颜色 我以前从未使用过enum,只是想知道它是否适用于此? 或者,我会将字段设置为非最终字段,并使用setAll(int主题)方法。我会使用至少一个枚举(如果不是两个的话)来实现这一点。一个用于ColorScheme,另一个

我有一个名为
ColorConstants
的类,它只是一个定义了在整个应用程序中使用的大量
公共静态最终颜色
字段的类,使更改颜色方案等变得容易。我想做的是有两个方案:反转,而不是反转。我想设置这个类,以便根据方案/主题,相同的字段名可以引用不同的颜色。而不是每次都检查/获取必要的颜色

我以前从未使用过
enum
,只是想知道它是否适用于此?
或者,我会将字段设置为非最终字段,并使用
setAll(int主题)
方法。

我会使用至少一个枚举(如果不是两个的话)来实现这一点。一个用于
ColorScheme
,另一个可能用于
Color
ColorScheme
将有(开始)两个元素,每个元素都可以“知道”其组成颜色。松散示例:

enum ColorScheme {

    NORMAL(Color.RED, Color.GREEN, Color.BLUE),
    INVERTED(Color.CYAN, Color.MAGENTA, Color.YELLOW);

    private final Set<Color> colors;

    public ColorScheme(Color... cs) {
        this.colors = EnumSet.of(cs)
    }
}
enum颜色方案{
正常(颜色。红色,颜色。绿色,颜色。蓝色),
倒置(颜色。青色,颜色。洋红,颜色。黄色);
私人最终设置颜色;
公共配色方案(颜色…cs){
this.colors=EnumSet.of(cs)
}
}

我不会在这里使用enum

我将创建一个包含所有颜色字段(非最终)但没有值的类。并创建扩展类来定义构造函数中的所有颜色

public abstract class ColorScheme
{
    public Color background;
    public Color foreground;
    public Color cursor;

}
现在创建ColorScheme的一个实现:

public class DarkColorScheme extends ColorScheme
{
    public DarkColorScheme()
    {
        background = new Color(0x111111);
        foreground = new Color(0xDDDDDD);
        cursor     = new Color(0xEEEEEE);
    }
}
现在,您可以使用如下颜色方案:

public ColorScheme colorScheme = new DarkColorScheme();

从现在起,您可以创建额外的配色方案,只需在新配色方案上方的行中使用,一切都应该动态工作。

设置对象的值与是否使用枚举无关


通过使用基本常量或枚举,可以获得相同的结果。在我看来,您应该使用枚举,因为这样更容易知道哪些常量可用,而且您还可以确保调用您的方法的人只向您发送枚举中定义的常量。

考虑使用一个
ColorScheme
类,该类保存单个配色方案中使用的颜色。 如果您的所有方案都是硬编码的,那么这可能是一个
enum
。例如:

public enum ColorScheme {
    NORMAL( Color.WHITE, Color.BLACK ),
    INVERTED( Color.BLACK, Color.WHITE );

    public final Color foreground;
    public final Color background;

    // Note that enum constructors *have* to be private
    private ColorScheme ( Color bg, Color fg ) {
        this.foreground = fg;
        this.background = bg;
    }
}
这将定义两种不同的颜色方案。然后可以传递这些对象,而更改颜色方案只是更改引用对象的一种方法。添加第三种颜色方案也会像添加另一个常量一样简单


这样做的缺点是无法在运行时扩展颜色方案的数量,因为
enum
s的实例数量有限(每个常量一个)。在某些情况下,对于代码中常用的字段,使其成为具有常量字段(
publicstaticfinal
)的常规类可能是更好的方法

嗯,如果
Color
是枚举,为什么是
ArrayList
而不是
EnumSet
?当然,为什么不是?就像我说的-只是一个松散的例子。我会编辑。很抱歉,没有(E…E)的枚举集。。。那堂课真是一团糟。看看JavaDoc,查看一下的
的所有重载@Martijn你看到的是古代的JavaDocs。但是仍然没有(E…E)的枚举集。。。我真的很喜欢这种方法,但是如果我有几个配色方案呢?我最初的想法是使用一个内部开关来确定方案,并让所有其他类静态地访问颜色。我可以将所有颜色方案类创建为私有类,只需切换颜色引用,而不是每次方案更改时重新定义每个颜色方案。我同意。谢谢。:)我同意。当然这里可以使用enum(毕竟,除了enum之外,您可以不使用任何东西),但我认为类确实更适合这里。特别是考虑到这种方式,您可以动态加载新的颜色方案,而不是使用硬编码的列表-这可能有一天会派上用场。@paranoid您必须指定使用哪种颜色集的位置,因此,不要替换静态颜色,只需将当前的ColorScheme实例替换为新实例即可。@Voo这就是我在评论中试图说的-这样做更有意义,你是对的。回答不错。我本来打算写这样的东西,但你抢先了我一步。可以通过解释“new DarkColorScheme()”的最佳位置来改进它,但是您在大约2分钟内编写了这篇文章。