2012-06-05 98 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被認爲是冗長語言的原因之一。