在这种情况下使用枚举是否正确?

时间:2014-09-08 09:23:20

标签: java enums

这是关于最佳实践/风格的问题。

我有一个可以打印出不同颜色元素的Printer类。使用Enum作为输入是否正确:

public class Printer {

public enum Color{RED, GREEN, BLUE}

public void print (Color color){
    MyElement myElement = new MyElement();
    switch (color) {
        case RED:
            myElement.setColor("#xxxxxx");
            break;
        case GREEN:
            myElement.setColor("#xxxxxx");
            break;
        case BLUE:
            myElement.setColor("#xxxxxx");
            break;
    }
    myElement.print();
}

}

然后只需从另一个类调用该方法:

Printer p = new Printer();
p.print(Printer.Color.RED);

...或者将这些值添加到枚举中会更好:

public class Printer {

    public enum Color {
        RED("#xxxxxx"), 
        GREEN("#xxxxxx"), 
        BLUE("#xxxxxx");

        private final String hex;

        Color(String hex){
            this.hex = hex;
        }

        public String getHex(){
            return this.hex;
        }
    }

    public void print (Color color){
        MyElement myElement = new MyElement();
        myElement.setColor(color.getHex());
        myElement.print();
    }

}

...或者根本不使用枚举,只使用普通字符串?

2 个答案:

答案 0 :(得分:5)

我发现您的解决方案没有任何问题。我唯一建议的是在Enum上创建一个构造函数并将颜色值存储在那里。但这只是一个建议。

就像这样:

public class Printer {

public enum Color{
    RED("#FF0000"), GREEN("#00FF00"), BLUE("#0000FF");

    private String colorAsString;

    private Color(String colorAsString) {
        this.colorAsString = colorAsString;
    }

    public String getColorAsString() {
        return this.colorAsString;
    }
}

public void print (Color color){
    MyElement myElement = new MyElement();
    myElement.setColor(color.getColorAsString());
    myElement.print();
}

}

答案 1 :(得分:2)

在常量位置使用enum通常是有意义的。如果应用程序像问题中解释的那样简单,只有1个参数(颜色值),使用字符串常量也很有效。

如果要使用enum,则第二种方法(即通过enum构造函数存储颜色值的方法)更可取。