2

インターフェイスを実装している別のオブジェクトに作業を委任するオブジェクトがあります。次に、このインターフェイスを実装する匿名クラスを作成しています。これらから情報を取得したいと思います。

サイズが 1 の final 配列をプリミティブへのポインタとして使用して、匿名クラスとデータを共有しても問題ありませんか?

これが私が意味することの実例です:

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);
    }
}

ありがとう

4

3 に答える 3

2

提案: out パラメーターにジェネリックを使用しないのはなぜですか?

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_;
      }
   }
}
于 2013-04-16T19:41:30.117 に答える
0

私があなたの質問の要点を理解していれば、最終的な配列をラッパーとして使用して、匿名の内部クラスとその外側のクラスの間でメモリを共有することが良い設計原則であるかどうか疑問に思っています。

私の経験では、これは 2 つのオブジェクト間でデータを共有する方法としてはかなり貧弱です。インターフェイスを別の方法で宣言する方がおそらく賢明です。オブジェクトを返すか、ジェネリックを使用して、匿名クラスから期待される型を指定します。

于 2013-04-16T19:43:06.623 に答える
0

あなたのアプローチの最大の問題の1つはカプセル化の欠如だと思います.InterfaceA実装は「グローバル」データホルダー(配列)を使用しており、この配列が他の場所で使用されることを防ぐ方法はありません。あらゆる種類の問題 (競合状態など) につながります。

よりクリーンな方法は、getInt() メソッドまたは同様のものを使用して、別のクラス (またはインターフェイス) を定義することです。

于 2013-04-16T19:43:36.547 に答える