【问题标题】:Change from String to Object Name Java从字符串更改为对象名称 Java
【发布时间】:2013-11-21 00:14:24
【问题描述】:

我有 3 个整数,分别命名为 A、B 和 C。它们将与数字 52 相乘。我有一个字符串,其中包含我想要乘以的整数的名称(例如,在我的字符串 type == A; 下方。

我想知道是否有任何方法可以将 String 的名称更改为我希望使用的 object/int 的名称。

我现在拥有的:

public class MultiplySomeNumbers{
    int A = 100;
    int B = 200;
    int C = 300;
    String type = "A";

    final int multiplied = 52;

    public int multiply(String type){
        return multiplied* ____ //What goes here?
    }

} 

我不想做这样的事情:

public int multiply(String type){
    if(type.equalsIgnoreCase("A"){
        return multiplied*A;
    }else if(type.equalsIgnoreCase("B"){
        ...

任何帮助将不胜感激!

【问题讨论】:

  • 你可以使用反射来获取字段值。
  • 如果您使用的是 Java 7+,则可以使用 switch 语句。
  • 对不起,我是 Java 新手,什么是反射?
  • 我有一个很长的 JSON 文件,其中包含活动名称作为字符串,如果使用 JSON getString 中的活动名称启动意图会很棒...!这是我的例子...

标签: java string object int


【解决方案1】:

不,这是不可能的(也许使用反射,但它仍然是不行的)。您认为可能需要它的每一种情况都不需要需要它。

有几个问题,但这里有几个:

  • 那些生成的变量没有智能感知
  • 代码很不清楚
  • 不明确的命名(如果您创建一个恰好与生成的变量同名的新变量怎么办?)
  • 等等等等等等

您将不得不选择第二个选项。

我们或许可以提供不同的解决方案,但问题目前还不清楚。也许您可以扩展一点,以便我们更好地帮助您。

【讨论】:

  • 就不同的解决方案而言,从我们仅有的一点点来看,这听起来像是一个很好的枚举用例。
  • 看起来确实如此。有关 enum 的示例实现,请参阅 Jonathan 的回答。
  • @yshavit:我不会为此使用枚举。枚举旨在具有常量的含义(所有这些在编译时都是已知的)。常数与变量的意义是对立的。如果这些字段都被声明为staticfinal,那么我绝对同意你的观点,即枚举是要走的路。由于不是,我倾向于使用 Collections API 的解决方案。
  • @scottb:它们视为常量。枚举及其值是常量,但这并不意味着您不能在方程式中使用这些常量。
  • @JeroenVannevel:当然。如果这些字段旨在表示常量(我正在查看 OP 的代码),那么它们确实应该被声明为 staticfinal。由于它们不是,我只能假设它们旨在用作设置为初始值的变量。在这种情况下,仍然可以使枚举工作(如果枚举字段是单元素数组),但这并不是最优的。对于可变数量,Map 比枚举更适合这个问题。
【解决方案2】:

虽然可能有一种方法可以通过反射来做到这一点,但这可能是一个非常糟糕的主意。如果你真的不能只传递值,而是想指定一组有限的常量,你可以乘以,我建议创建一个枚举类型。

以您的相同示例,但使用 enum 而不是尝试按名称查找常量,看起来像这样:

public class MultiplySomeNumbers{
  public enum Type {
    A(100),
    B(200),
    C(300);

    private final int value;

    private Type(int value) {
      this.value = value;
    }

    public final int getValue() {
      return value;
    }
  }

  Type type = Type.A;

  final int multiplied = 52;

  public int multiply(Type type){
    return multiplied * type.getValue();
  }
} 

【讨论】:

    【解决方案3】:

    虽然在此解决方案中使用枚举没有任何问题,但它可能不是最灵活的解决方案。根据设计,枚举实际上是不可变的……它们旨在具有常量的含义。如果您希望通过将变量的值乘以 52 来更改变量的值,那么使用枚举是不可能的。

    我认为你真正应该做的是使用 HashMap。 Map 是一个键/值对。

    • 关键是“变量名”;一个字符串数量
    • 该值为“变量的当前值”;一个整数(不是整数!)

    您的地图可以这样声明:

    Map<String, Integer> myVariables = new HashMap<String, Integer>();
    

    然后要将变量加载到地图中,只需调用地图的put() 方法:

    myVariables.put("A", Integer.valueOf(100));
    myVariables.put("B", Integer.valueOf(200));
    myVariables.put("C", Integer.valueOf(300));
    

    检索变量的值就像使用get() 方法一样简单,以您的变量名作为键:

    int val = myVariables.get("A").intValue();
    

    请注意,我已选择自己对原始 int 值进行装箱和拆箱,而不是依赖自动装箱。这只是个人选择。它确实牺牲了简洁性,但我宁愿看看实际发生了什么。

    在我看来,使用反射来确定在运行时动态访问的类字段是完全不能令人满意的,应该避免......尤其是因为使用 Java Collections API 可以实现可以检查的静态类型、类型安全的解决方案在编译时。

    【讨论】:

      【解决方案4】:

      您无法检查变量的名称。有关更多信息,请查看此处,有一些很好的答案: Java Reflection: How to get the name of a variable?

      但也许 HashMap 可以帮助您,您可以将“A”、“B”、“C”作为键存储,将相应的数字作为值存储。

      编辑:好的,也许像http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Field.html 这样的东西是可能的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多