【问题标题】:How to use names to access variables in Java?如何使用名称访问 Java 中的变量?
【发布时间】:2011-09-17 09:33:15
【问题描述】:

我正在尝试在一个类中编写一个可以多次调用的方法,每次都修改一个类的字段。但是,如果我想修改它,我需要new 对象并将字段的值设置为它,但是如果在方法内部执行此操作,则引用似乎丢失并且在调用后字段保持不变。

Public class A {
    private Immutable a;  //Immutable class
    private Immutable b;
    public void modify(Immutable k,int v) {
        k=new Immutable(v);  //Now I am trying to pass 
                             //a and b as parameters but they remain unchanged
    }
}

有没有什么办法可以将字段名传入方法中(比如把方法modify(Immutable k, int v)改成modify(String kName, int v),然后用字段名来访问?

感谢您的任何意见!

【问题讨论】:

    标签: java variables methods parameters immutability


    【解决方案1】:

    如果您需要通过字符串键访问变量,您应该使用Map

    Map<String, Immutable> _vars = new HashMap<String, Immutable>();
    
    public void modify(String key, int v) {
      _vars.put(key, new Immutable(v);
    }
    

    【讨论】:

      【解决方案2】:

      我的理解是,您正在尝试在给定整数 (v) 的情况下创建一个新的不可变对象。在您现在的修改方法中, k 是一个临时参考。在此处设置值“k =”,仅影响存储在此方法中的引用,而不影响您称为修改的任何引用。

      您目前有这样的客户端代码:

      A a = new A();
      Immutable k = new Immutable(x);
      a.modify(k, y);
      

      你希望 k 会被改变。你真正想要的而不是第 3 行是:

      k = new Immutable(y);
      

      假设事情真的更复杂,那么我需要更多信息来进一步帮助你。

      【讨论】:

        【解决方案3】:

        Java 不支持按名称调用或按引用调用,仅支持按值调用。您的k 变量(方法参数)完全独立于类外使用的任何变量(如果有的话)。

        您可以使用反射来支持传递“a”或“b”(或 Field 对象),但您不应该这样做。

        最好有两种方法:

        public void setA(int v) {
            this.a = new Immutable(v);
        }
        
        public void setB(int v) {
            this.b = new Immutable(v);
        }
        

        如果它比单个构造函数调用更复杂,请将通用部分分解为通用方法。

        【讨论】:

        • ŭlo 谢谢!但是有两个问题:首先,为什么不应该使用反射?其次,如果我有一堆不同的字段,有没有方便的方法来访问它们?
        • 风格问题。你班的客户应该不知道你的领域,这是你班的私人领域。因此说“请将您的字段 x 设置为 y”是不正确的做法。
        • 如果你真的有很多这样的属性,请使用 unholysampler 建议的地图。
        【解决方案4】:

        使用价值持有者。

        public class ValueHolder<T> {
            private T value ;
            public ValueHolder(T value) {
                this.value = value ;
            }
            public T get() { 
                return value ; 
            }
            public void set(T value) { 
                this.value = value; 
            }
            public static <V> ValueHolder<V> make(V value) {
                return new ValueHolder<V>(value);
            }
        }
        public class Processor {
            private Inmutable a ;
            private Inmutable b ;
            public void modify(ValueHolder<Inmutable> k, int v) {
                k.set(new Inmutable(v));
            }
        }
        

        完成后,您可以从值持有者那里获取刚刚创建的实例。

        Processor processor = new Processor();
        ValueHolder<Inmutable> holder = ValueHolder.make(k);
        processor.modify(holder, value);
        k = holder.get() ;
        

        【讨论】:

          猜你喜欢
          • 2016-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-29
          • 2021-12-17
          • 1970-01-01
          • 2010-10-25
          • 1970-01-01
          相关资源
          最近更新 更多