枚举相同(不同语言)的类

时间:2017-04-15 17:06:16

标签: java

我想写枚举,其中包含两种语言(或更多)的月份名称,例如。一月用英语和其他语言的东西。我是否必须创建两个相同的枚举,只有名称字段不同?我无法扩展枚举,所以我不知道如何以其他方式做到这一点......

4 个答案:

答案 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());

还有很多其他方法。目的是使其易于使用和扩展。