我想写枚举,其中包含两种语言(或更多)的月份名称,例如。一月用英语和其他语言的东西。我是否必须创建两个相同的枚举,只有名称字段不同?我无法扩展枚举,所以我不知道如何以其他方式做到这一点......
答案 0 :(得分:1)
如何创建一个能够提供月份语言特定文本的枚举?
public enum Month {
JAN("january","..."),
FEB("february","..."),
MAR("march","..."),
APR("april","...");
Month(String english, String spanish){
this.english=english;
this.spanish = spanish;
}
protected String english;
protected String spanish;
public String getEnglish() {
return this.english;
}
public String getSpanish() {
return this.spanish;
}
}
另一种方法是提供月份的简单枚举,然后提供工厂方法来创建特定于语言的文本值。此解决方案更具可扩展性,因为它允许您在不更改枚举签名的情况下添加新语言。
public enum Month {
JAN,
FEB,
MAR,
APR,
....
}
public interface MonthConverter {
public String toText(Month value);
}
public class MonthEnglish implements MonthConverter {
@Override
public String toText(Month value) { ... }
}
public class MonthSpanish implements MonthConverter {
@Override
public String toText(Month value) { ... }
}
答案 1 :(得分:0)
您可以使用其中一种语言创建枚举值,然后将另一种语言作为字段提供:
public enum Month {
JANUARY("Enero", "Gennaio");
private String spanishMonth, italianMonth;
private Month(String spanishMonth, String italianMonth) {
this.spanishMonth = spanishMonth;
this.italianMonth = italianMonth;
}
public String getSpanishMonth() {
return spanishMonth;
}
public String getItalianMonth() {
return italianMonth;
}
}
如果您想使用其他语言进行搜索,只需创建一个Map
按值存储它们:
private static final Map<String, Month> MONTHS = new HashMap<>();
static {
Arrays.stream(values()).forEach(month -> {
MONTHS.put(month.getSpanishMonth(), month);
MONTHS.put(month.getItalianMonth(), month);
}
});
public static Month monthForName(String name) {
return MONTHS.get(name);
}
答案 2 :(得分:0)
我想写枚举,其中包含两个月的名字 语言(或更多),例如。一月用英语写,另一用 语言。
我建议你不要这样做。为什么?因为如果要扩展应用程序并添加对新语言的支持,则必须更改新语言的枚举代码和新方法。
您可以使用策略模式来解决此问题
您将有“常规”enum
数月
enum Month {
JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC;
}
获取月份名称的界面
interface MonthNames {
public String getMonthName(Month month);
}
要获得英文名称月份,这是界面的实现
class EnglishMonthNames implements MonthNames {
private static Map<Month, String> monthNames = new HashMap<>();
static {
monthNames.put(Month.JAN, "January");
monthNames.put(Month.FEB, "February");
// ...
}
@Override
public String getMonthName(Month month) {
return monthNames.get(month);
}
}
添加对西班牙语的支持
class SpanishMontNames implements MonthNames {
private static Map<Month, String> monthNames = new HashMap<>();
static {
monthNames.put(Month.JAN, "Enero");
// ...
}
@Override
public String getMonthName(Month month) {
return monthNames.get(month);
}
}
使用示例
public class MonthDemo {
public static void main(String[] args) {
EnglishMonthNames english = new EnglishMonthNames();
System.out.println("The first month in year is " + english.getMonthName(Month.JAN));
SpanishMontNames spanish = new SpanishMontNames();
System.out.println("Spanish name for January is " + spanish.getMonthName(Month.JAN));
}
}
答案 3 :(得分:0)
如果您对这些语言进行硬编码,那么您将有一段时间来扩展语言选择。您可以向枚举添加一个方法,以便从规范表示中进行转换,例如
public String translate(Language language);
然后只有Language
实现需要逻辑来翻译Month
实例,可能是基于其规范字符串,通过对翻译的服务调用,或通过Map
查找的类型其他人建议。外化翻译满足单一责任原则(SRP),遵循对界面的编程,并且更容易注入不同的实现。
Language
可能被定义为
public interface Language {
String translate(String value);
}
public class FrenchMonths implements Language {
private static final Map<String, String> months;
static {
Map<String, String> mons = new HashMap<>();
mons.put(Month.JANUARY.toString(), "Janvier);
...
months = Collections.unmodifiableMap(mons);
}
@Override public String translate(String translate) {
return months.get(translate);
}
}
枚举会有
public String translate(Language language) {
return language.translate(toString());
}
您可以像
一样使用它JANUARY.translate(new FrenchMonths());
或
getMonth().translate(getLanguage());
还有很多其他方法。目的是使其易于使用和扩展。