从字符串更改为对象名Java

从字符串更改为对象名Java,java,string,object,int,Java,String,Object,Int,我有3个整数,分别是A、B和C。它们将与数字52相乘。我有一个字符串,它包含我想在下面的示例中使用的int的名称,我的字符串类型==a 我想知道是否有任何方法可以将字符串的名称更改为我希望使用的对象/int的名称 我现在所拥有的: public class MultiplySomeNumbers{ int A = 100; int B = 200; int C = 300; String type = "A"; final int multiplied

我有3个整数,分别是A、B和C。它们将与数字52相乘。我有一个字符串,它包含我想在下面的示例中使用的int的名称,我的字符串类型==a

我想知道是否有任何方法可以将字符串的名称更改为我希望使用的对象/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"){
        ...
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();
  }
} 
Map<String, Integer> myVariables = new HashMap<String, Integer>();

任何帮助都将不胜感激

不,这在反射中是不可能的,但这仍然是不可能的。每一个你认为你可能需要它的情况都不需要它

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

这些生成的变量没有智能感知 非常不清楚的代码 命名不明确如果创建的新变量与生成的变量具有相同的名称,该怎么办? 等等等等等等 你必须选择第二种选择


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

不,这是不可能的,也许是反射,但这仍然是不可能的。每一个你认为你可能需要它的情况都不需要它

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

这些生成的变量没有智能感知 非常不清楚的代码 命名不明确如果创建的新变量与生成的变量具有相同的名称,该怎么办? 等等等等等等 你必须选择第二种选择


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

您不能检查变量的名称。有关更多信息,请参见此处,这里有一些很好的答案:

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


编辑:好的,也许用这样的方法是可能的。

你不能检查变量的名称。有关更多信息,请参见此处,这里有一些很好的答案:

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


编辑:好吧,也许像这样的东西是可能的。

尽管有一种方法可以通过反射来实现这一点,但这可能是一个非常糟糕的主意。如果您真的不能只传入值,而是希望指定一组有限的常量,通过这些常量可以进行乘法,我建议您创建一个枚举类型

以相同的示例为例,但使用枚举而不是尝试按名称查找常量,类似如下所示:

public int multiply(String type){
    if(type.equalsIgnoreCase("A"){
        return multiplied*A;
    }else if(type.equalsIgnoreCase("B"){
        ...
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();
  }
} 
Map<String, Integer> myVariables = new HashMap<String, Integer>();

虽然可能有一种方法可以通过反射来实现这一点,但这可能是一个非常糟糕的主意。如果您真的不能只传入值,而是希望指定一组有限的常量,通过这些常量可以进行乘法,我建议您创建一个枚举类型

以相同的示例为例,但使用枚举而不是尝试按名称查找常量,类似如下所示:

public int multiply(String type){
    if(type.equalsIgnoreCase("A"){
        return multiplied*A;
    }else if(type.equalsIgnoreCase("B"){
        ...
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();
  }
} 
Map<String, Integer> myVariables = new HashMap<String, Integer>();

虽然为该解决方案使用枚举没有什么错,但它可能不是最灵活的解决方案。枚举在设计上是有效的不可变的。。。它们旨在具有常数的意义。如果希望通过将变量的值乘以52来更改变量的值,则枚举不可能实现这一点

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

键是变量的名称;字符串数量 该值是变量的当前值;整数不是整数! 您的地图可以这样声明:

public int multiply(String type){
    if(type.equalsIgnoreCase("A"){
        return multiplied*A;
    }else if(type.equalsIgnoreCase("B"){
        ...
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();
  }
} 
Map<String, Integer> myVariables = new HashMap<String, Integer>();
检索变量的值非常简单,只需使用get方法并将变量名作为键即可:

int val = myVariables.get("A").intValue();
请注意,我选择了自己装箱和取消装箱原始int值,而不是依赖自动装箱。这只是个人的选择。它确实权衡了简洁性,但我更愿意看到实际发生的事情


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

虽然为该解决方案使用枚举没有错,但它可能不是最灵活的解决方案。枚举在设计上是有效的不可变的。。。它们旨在具有常数的意义。如果希望通过将变量的值乘以52来更改变量的值,则枚举不可能实现这一点

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

键是变量的名称;字符串数量 该值是变量的当前值;整数不是整数! 您的地图可以这样声明:

public int multiply(String type){
    if(type.equalsIgnoreCase("A"){
        return multiplied*A;
    }else if(type.equalsIgnoreCase("B"){
        ...
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();
  }
} 
Map<String, Integer> myVariables = new HashMap<String, Integer>();
检索变量的值非常简单,只需使用get方法并将变量名作为键即可:

int val = myVariables.get("A").intValue();
请注意,我选择了自己装箱和取消装箱原始int值,而不是依赖自动装箱。这只是个人的选择。它确实权衡了简洁性,但我更愿意看到实际发生的事情


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

您可以使用反射来获取字段值。如果您使用的是Java 7+,则可以使用switch语句。很抱歉,我是Java新手,什么是反射?我有一个以活动名称为字符串的长JSON文件,使用JSON getString中的活动名称启动intent将是非常棒的!这是我的示例…您可以使用反射来获取字段值。如果您使用的是Java 7+,则可以使用switch语句。很抱歉,我是Java新手,什么是反射?我有一个长JSON文件,其中活动名称为字符串,使用JSON getString中的活动名称启动intent将非常好!这是我的例子…就不同的解决方案而言,从我们所拥有的一点来看,它听起来像是Enum的一个很好的用例。看起来确实如此。请参阅Jonathan的答案,了解枚举的示例实现。@yshavit:我不会为此使用枚举。枚举旨在具有常量的意义,所有这些常量在编译时都是已知的。常数与变量的意义相反。如果所有字段都被声明为静态和最终的,那么我绝对同意您的看法,即使用枚举是可行的。因为它们不是,所以我倾向于使用Collections API的解决方案。@scottb:它们被视为常量。枚举及其值是常量,但这并不意味着不能在方程中使用这些常量。@Jeroenvanevel:绝对可以。如果这些字段是用来表示常量的,我正在看OP的代码,那么它们真的应该被声明为静态和最终的。因为它们不是,所以我只能假设它们是用作设置为初始值的变量。在这种情况下,如果枚举字段是单元素数组,则仍然可以使枚举工作,但它几乎不是最优的。对于变量,映射比枚举更适合于此问题。就不同的解决方案而言,从我们所拥有的一点来看,它似乎是枚举的一个很好的用例。看起来确实如此。请参阅Jonathan的答案,了解枚举的示例实现。@yshavit:我不会为此使用枚举。枚举旨在具有常量的意义,所有这些常量在编译时都是已知的。常数与变量的意义相反。如果所有字段都被声明为静态和最终的,那么我绝对同意您的看法,即使用枚举是可行的。因为它们不是,所以我倾向于使用Collections API的解决方案。@scottb:它们被视为常量。枚举及其值是常量,但这并不意味着不能在方程中使用这些常量。@Jeroenvanevel:绝对可以。如果这些字段是用来表示常量的,我正在看OP的代码,那么它们真的应该被声明为静态和最终的。因为它们不是,所以我只能假设它们是用作设置为初始值的变量。在这种情况下,如果枚举字段是单元素数组,则仍然可以使枚举工作,但它几乎不是最优的。对于可变数量,映射比枚举更适合此问题。