2013-04-16 72 views
2

我有一個對象將一些工作委派給另一個實現接口的對象。然後,我創建了實現這個接口的匿名類,我想從這些信息中獲得信息。如何從匿名類中獲取不同類型的數據

可以使用一個大小爲1的最終數組作爲指向primitve的數據與匿名類共享數據嗎?

這裏是我的意思工作的例子:

public class ExampleClass 
{ 
    public static final int INVALID_VALUE = -1; 

    public static void main(final String[] args) 
    {  
     final int[] buffer = { INVALID_VALUE }; // buffer is created 
     final InterfaceA iaObject = new InterfaceA() 
     { 
      @Override 
      public void doStuff(final String paramA) 
      { 
       buffer[0] = paramA.length(); // buffer is filled in anonymous class 
      } 
     }; 

     final ClassA objA = new ClassA(iaObject); 
     objA.doStuff("hello, world"); 

     if (buffer[0] == INVALID_VALUE) // buffer is used 
     { 
      System.err.println("Invalid length !"); 
     } 
     else 
     { 
      System.err.println("The length is : " + Integer.toString(buffer[0])); 
     } 
    } 

    public static class ClassA 
    { 
     private final InterfaceA iaObject; 

     public ClassA(final InterfaceA iaObject) 
     { 
      this.iaObject = iaObject; 
     } 

     public void doStuff(final String paramA) 
     { 
      this.iaObject.doStuff(paramA); 
     } 
    } 

    public static interface InterfaceA 
    { 
     void doStuff(String paramA); 
    } 
} 

感謝

+1

爲什麼不讓doStuff返回int呢? –

+0

您應該使用int而不是數組,因爲您只使用一個位置 –

+0

@ Zim-ZamO'Pootertoot doStuff不會返回int,因爲我有時需要布爾值,String和其他類型的值。 – phil

回答

2

建議:爲什麼不使用通用的輸出參數?

interface InterfaceA { 

    public <T> void doStuff(String paramA, Holder<T> holder); 
} 

class Holder<T> { 

    public T t; 
} 

完整的示例:

public class ExampleClass 
{ 
    public static final int INVALID_VALUE = -1; 

    public static void main(final String[] args) 
    {  
     final InterfaceA<Integer> iaObject = new InterfaceA<Integer>() { 
     @Override 
     public Integer doStuff(String paramA, Holder<Integer> holder) { 
      return holder.value = paramA.length(); 
     } 
     }; 

     final ClassA<Integer> objA = new ClassA<>(iaObject); 
     int result = objA.doStuff("hello, world", new Holder<>(INVALID_VALUE)); 
     if(result == INVALID_VALUE) { 
     System.err.println("Invalid length !"); 
     } 
     else { 
     System.err.println("The length is : " + Integer.toString(result)); 
     } 
    } 

    public static class ClassA<T> { 
     private final InterfaceA<T> iaObject; 

     public ClassA(final InterfaceA<T> iaObject_) { 
     this.iaObject = iaObject_; 
     } 

     public T doStuff(final String paramA, Holder<T> holder) { 
     return this.iaObject.doStuff(paramA, holder); 
     } 
    } 

    public static interface InterfaceA<T> { 
     public T doStuff(String paramA, Holder<T> resultHolder); 
    } 

    public static class Holder<T> { 

     public T value; 

     public Holder(T value_) { 
     value = value_; 
     } 
    } 
} 
+0

我已經使該接口成爲一個抽象泛型類,並帶有一個getter和一個setter的值。 – phil

+0

是的,它會更好。 – Aubin

+0

感謝您的完整示例,但我無法修改'ClassA'的結構。 – phil

0

如果我明白你的問題的要點,你想知道,如果它是很好的設計原則使用最終數組作爲包裝共享內存匿名之間內部類和它的封閉類。

以我的經驗,這是在兩個對象之間共享數據的一種非常糟糕的方式。以不同的方式聲明你的界面可能更爲明智。要麼返回一個對象,要麼使用泛型來指定您期望從匿名類返回的類型。

0

我認爲你的方法最大的問題之一是缺乏封裝 - 你的InterfaceA實現使用一些「全局」數據持有者(數組),並且沒有辦法阻止這個數組可以在其他地方使用,這反過來可能會導致各種問題(比賽條件或其他)。

更清晰的方法是使用getInt()方法或類似的方法定義一些獨立的類(或接口)。