0

我使用这个很棒的 Java 库使用 Google Translate 非官方 API 将文本转换为语音。

使用此代码,它能够“阅读”英文文本(请参阅 参考资料Language.ENLGISH):

Audio audio = Audio.getInstance();
InputStream sound  = audio.getAudio("I am a bus", Language.ENGLISH);
audio.play(sound);

我有一个包含所有语言的列表(一个组合框)。

如何将字符串转换"ENGLISH"为字段Language.ENGLISH

我不想if在代码中使用很多 s ( if (mySelectedLanguage.equals("ENGLISH") // ...Language.English)。

我已经尝试过:

  • Language["ENGLISH"]受 Javascript 启发,但它不起作用
  • Language.class.getField("ENGLISH").toString()(toString 因为它们的类型是 String: public static final String ENGLISH

哪一种才是真正有效的正确方法?

编辑:我已经在这里问过如何获取语言。也许它可以帮助我们找到答案。

4

2 回答 2

1

创建您自己的枚举来存储这些值。无论您遇到什么困难,这都是一种很好的做法——通过为这个第三方类创建一个外观,您可以解耦代码的一部分。

如果toString()按如下所示实现,则可以将这些枚举值直接存储在组合框中。

public enum Languages {

  ENGLISH(Language.ENGLISH, "English"),
  // etc..
  ;

  private final String languageName;
  private final String displayName;

  private Languages(String languageName, String displayName) {
    this.languageName = languageName;
    this.displayName = displayName;
  }

  public String getLanguageString() {
    return languageName;
  }


  public String getDisplayString() {
    return displayName;
  }

  public static Languages fromString(String languageString) {
    for (Language l : values()) {
      if (l.getLanguageString().equals(languageString)) {
        return l;
      }
    }
    return null;
  }

  // optional
  @Override
  public String toString() {
    return displayName;
  }    
}

也许选择一个更好的名字比Languages- 我感觉不是很受鼓舞。

于 2013-04-29T18:12:52.227 回答
1

如果要获取公共静态字段的值

然后代替

Language.class.getField("ENGLISH").toString();

利用

(String)Language.class.getField("ENGLISH").get(null);

null表示您不想从某个对象中获取字段,而是从整个类中获取字段(在静态变量的情况下,这是期望的行为)


但是,如果可能的话,我建议您将 Language 类重写为枚举并使用Language.valueOf("ENGLISH")

于 2013-04-29T18:17:20.523 回答