1
0

More than 1 year has passed since last update.

[Java] デザインパターン - Iterator

Last updated at Posted at 2023-02-13

目的

以下の書籍を読んで、デザインパターンについて学習したため、その備忘録として記事を作成する。

  • Java言語で学ぶデザインパターン入門 第3版 (著: 結城浩)

Iteratorパターンとは

何かがたくさん集まっているときにそれを順番に指し示していき、全体をスキャンして処理を繰り返すもの。

  • 具体例(配列arrの宣言は省略)
for (int i; i < arr.length; i++) {
  Sysytem.out(arr[i]);
}

上記のように変数iが添字として役割を果たし、ループごとに次の要素を指し示している。
ここで使われている変数iを抽象化し、一般化したものをデザインパターンでは「Iteratorパターン」 と呼ぶ。

実際に使ってみる

ライブラリに、java.util.iterator<E>のインターフェースがあり、以下メソッドを持つ。(詳細はURLを参照)

  • forEachRemaining
  • hasNext
  • next
  • remove

書籍中のサンプルでは、next()hasNext()が使われているため、今回はforEachRemaining()を使ってみる。

サンプルコード

  • 本棚をスキャンする
Book.java
package Iterator;

public class Book {
  private String name;

  public Book(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }
}
BookShelf.java
package Iterator;

import java.util.Iterator;

public class BookShelf implements Iterable<Book> {
  private Book[] books;
  private int last = 0;

  public BookShelf(int maxSize) {
    this.books = new Book[maxSize];
  }

  public Book getBookAt(int index) {
    return books[index];
  }

  public void appendBook(Book book) {
    this.books[last] = book;
    last++;
  }

  public int getLength() {
    return last;
  }

  @Override
  public Iterator<Book> iterator() {
    return new BookShelfIterator(this);
  }
}
BookShelfIterator.java
package Iterator;

import java.util.Iterator;
import java.util.NoSuchElementException;

public class BookShelfIterator implements Iterator<Book> {
  private BookShelf bookShelf;
  private int index;

  public BookShelfIterator(BookShelf bookShelf) {
    this.bookShelf = bookShelf;
    this.index = 0;
  }

  @Override
  public boolean hasNext() {
    if (index <  bookShelf.getLength()) {
      return true;
    } else {
      return false;
    }
  };

  @Override
  public Book next() {
    if(!hasNext()) {
      throw new NoSuchElementException();
    }
    Book book = bookShelf.getBookAt(index);
    index++;
    return book;
  };
}
  • 実行用
Main.java
package Iterator;

import java.util.Iterator;

public class Main {
  public static void main(String[] args) {
    BookShelf bookShelf = new BookShelf(4);
    bookShelf.appendBook(new Book("Sword Art Online"));
    bookShelf.appendBook(new Book("Fate/Stay night"));
    bookShelf.appendBook(new Book("Uncle from Another World"));
    bookShelf.appendBook(new Book("Vinland Saga"));

    Iterator<Book> it = bookShelf.iterator();
    it.forEachRemaining(book -> {
      System.out.println(book.getName());
    });
  }
}
出力結果
Sword Art Online
Fate/Stay night
Uncle from Another World
Vinland Saga

感想

  • 思っていたより馴染みのある書き方で使いやすかった。
  • エンジニア1年目でこの本を渡された時は「???」だったが、Java Sliverくらいの知識を持っているとスラスラ頭に入って面白い。(完全な初心者は分かりにくいかも)

以上。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0