倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

アノテーションでデザインパターンの役割をマークする (7):「Iterator パターンの役割マーク」改善の試み 其ノ弐

今回は、前回の問題点の解決法をチョットだけ違った形で。

改善点


前回の解決方法「ConcreteXxxx アノテーションに定義されている子アノテーションを除去する」に加えて、@ConcreteIterator, @ConcreteAggregate アノテーションに代えて @Iterator.Concrete, @Aggregate.Concrete アノテーションを用います。

アノテーションを定義する Java コード


上記の改善点を踏まえたアノテーション定義は以下のようになります。

package org.waman.tools.design.gof.IteratorPattern;

import java.lang.annotation.*;

public final class IteratorPattern {
    
    private IteratorPattern(){}
        
    /** 集約子 */
    @Target(ElementType.TYPE)
    public static @interface Aggregate{
        
        /** 反復子を生成するメソッド */
        @Inherited
        @Target(ElementType.METHOD)
        public static @interface CreateIterator{}

        /** 具象集約子 */
        @Target(ElementType.TYPE)
        public static @interface Concrete{}
    }

    /** 反復子 */
    @Target(ElementType.TYPE)
    public static @interface Iterator {

        /** 次の要素があるかどうかの問い合わせを行うメソッド */
        @Inherited
        @Target(ElementType.METHOD)
        public static @interface HasNext {}

        /** 次の要素を取得するメソッド */
        @Inherited
        @Target(ElementType.METHOD)
        public static @interface Next {}

        /** 具象反復子 */
        @Target(ElementType.TYPE)
        public static @interface Concrete{}
    }
}

@Xxxx.Concrete アノテーションに @Inherited アノテーションを付加する必要はないでしょう。 一応、具象クラスを継承して抽象クラスにすることもできますし(やらない方が良いでしょうけど)。

サンプルコード in 『Java 言語で学ぶデザインパターン入門』


Book クラス, Iterator インターフェース, Aggregate インターフェース

これらは前回と同じです。

BookShelf クラス

Aggregate の具象クラス。 Aggregate インターフェースに定義されているメソッドには @Override アノテーションを付加しています。

import org.waman.tools.design.gof.IteratorPattern;

@IteratorPattern.Aggregate.Concrete
public class BookShelf implements Aggregate<Book>{
    ...
    @Override public Iterator<E> iterator(){...}
}

BookShelfIterator クラス

Iterator の具象クラスです。 Iterator インターフェースに定義されているメソッドに関しては @Override アノテーションを付加しています。

import org.waman.tools.design.gof.IteratorPattern;

@IteratorPattern.Iterator.Concrete
public class BookShelfIterator implements Iterator<Book> {
    @Override public boolean hasNext(){...}
    @Override public E next(){...}
}

ほとんど変わってませんけど。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門


オブジェクト指向における再利用のためのデザインパターン

オブジェクト指向における再利用のためのデザインパターン

  • 作者: エリックガンマ,ラルフジョンソン,リチャードヘルム,ジョンブリシディース,Erich Gamma,Ralph Johnson,Richard Helm,John Vlissides,本位田真一,吉田和樹
  • 出版社/メーカー: ソフトバンククリエイティブ
  • 発売日: 1999/10
  • メディア: 単行本
  • 購入: 21人 クリック: 711回
  • この商品を含むブログ (201件) を見る