【问题标题】:Converting from String to field that is a String从字符串转换为字符串字段
【发布时间】:2013-04-29 18:03:22
【问题描述】:

我使用this great Java library 使用 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

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

我已经尝试过:

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

真正有效的正确方法是什么?

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

【问题讨论】:

  • Language 枚举吗?如果是,那么您可以使用Language.valueOf("ENGLISH") 返回其Language.ENGLISH 字段。
  • 不,它不包含valueOf。没有语言,它只包含class
  • @John So Language 不是枚举?
  • @DuncanJones,不,不是。
  • @Pshemo,是的,它是:public static final String ENGLISH

标签: java google-api google-translate


【解决方案1】:

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

然后代替

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

使用

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

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


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

【讨论】:

  • 如果不是字符串则抛出错误:需要String 并找到Object
  • 如果您知道该字段 is 字符串,那么您可以将其转换为 (String)Language.class.getField("ENGLISH").get(null);
  • 太棒了。我已经尝试过这种方式,但是使用toString(),它会抛出一个错误“它不可转换......”或类似的东西。 :-) 谢谢。
【解决方案2】:

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

如果您实现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 更好的名字 - 我感觉不是很有灵感。

【讨论】:

  • 我会使用最短的方法。另外,我不是一个出色的 Java 程序员……只是玩了一下而已。
  • @John 你问“哪种方法真正有效?”。我认为这个答案是“正确”的方式。最短的方法是您的一长串 if 语句,或者只是一个 Map 将字符串映射到字符串。
  • 鉴于我已经写了这门课的 80%,这可能是一条很短的路线! :-)
  • +1,给你答案,但我不会标记它。我已经标记了另一个答案。一探究竟。它正在工作!
  • @John 真可惜。不是因为我关心公认的答案,而是因为当有更优雅的解决方案时,您已经诉诸反思!没关系:-)
猜你喜欢
  • 2011-09-22
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多