繁体   English   中英

从字符串更改为对象名称Java

[英]Change from String to Object Name Java

我有3个分别称为A,B和C的整数。这些整数将与数字52相乘。我有一个字符串,其中包含我要混合使用的整数的名称(例如,在我的字符串type == A;

我想知道是否仍然可以将String的名称更改为我想使用的对象/ 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"){
        ...

任何帮助将不胜感激!

不,这是不可能的(也许使用Reflection,但还是不行)。 认为可能需要的每种情况都不需要它。

有几个问题,但有几个:

  • 这些生成的变量无智能
  • 代码非常不清楚
  • 模棱两可的命名(如果您创建一个刚好与生成的变量同名的新变量,该怎么办?)
  • 等等等

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

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

尽管也许可以通过反射来做到这一点,但这可能是一个非常糟糕的主意 如果您确实不能只传递值,而是想指定一组有限的常量以进行乘法运算,则建议创建一个枚举类型。

以您的相同示例为例,但是使用一个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();
  }
} 

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

我认为您真正应该做的是使用HashMap。 映射是键/值对。

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

您的地图可以这样声明:

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可以在编译时检查静态类型安全的解决方案。

您无法检查变量的名称。 有关更多信息,请参见此处,有一些很好的答案: Java反射:如何获取变量的名称?

但是也许HashMap可以为您提供帮助,您可以在其中存储“ A”,“ B”,“ C”作为键,并将相应的数字存储为值。

编辑:好的,也许可以使用类似http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Field.html的方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM