2012-06-05 48 views
1

有时我想将不可变对象传递给方法,并在方法内部更改其值,或者我想将另一个对象分配给参数引用(示例1)。或者我想将匿名内部类的另一个对象分配给最终的局部变量(示例2)。因为所有这些情况都是不可能的,所以有时我会使用Atomic(Integer | Long ...)类或列表(这真的很糟糕,因为列表可以包含多个对象)。或者,我可以创建其持有的对象,并允许改变对象的类:是否存在Java“引用对象”?

public class ReferenceExample { 

    public static void main(String[] args) { 
     final Reference<String> string = new Reference<>("a"); 
     // Example 1: 
     method(string); 

     // Example 2: 
     new Thread() { 
      @Override 
      public void run() { 
       string.set("c"); 
      }; 
     }.start(); 
    } 

    public static void method(Reference<String> string) { 
     string.set("b"); 
    } 

    private static class Reference<T> { 
     private T value; 

     public Reference() {} 

     public Reference(T value) { 
      this.value = value; 
     } 

     public T get() { 
      return value; 
     } 

     public void set(T value) { 
      this.value = value; 
     } 
    } 

} 

我想知道如果这样的类并在Java或公用库已经存在(例如在Apache共同的项目)?如果没有,那么对于这些​​问题还有其他解决方案吗?

回答

2

你已经发现的主要解决方案,但其他两种常见的方法是

  • AtomicReference,这看起来你已经找到
  • 一个单元素数组,其作用或多或少作为一个可变参考

这就是说,你通常可以找到各地要方式:

  • 从你的方法
  • 返回(可能不同的)参考实施含有可变引用作为字段,这是经常更合适反正
类内部时,方法
0

在普通的java中没有通用和通常使用的解决方案。使用一个而不是使用javaish特定解决方案可能是不好的做法。

常见的解决方案:

  • 让呼叫者使assignement:

    myVal = anObject.aMethod(myVal);

  • 提供封闭的对象

    anObject.aMethod(this);

  • 提供了一个回调函数,它将为变量赋值一个新值。为了这个,你通常需要定义你的回调实现一个接口:

    anObject.aMethod(新MySetter(){ 公共无效集(INT的newval){ =设为myVal的newval; }; });

这是完全正确的是Java的力量,你赚更多的封装有时,你会想。这看起来可能是一件好事,或者可能被视为java被认为是冗长语言的原因之一。