2013-04-16 155 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()方法或类似的方法定义一些独立的类(或接口)。