SlideShare a Scribd company logo
1 of 17
Download to read offline
Iterator
2010 年 11 月 18 日
新たなヒーローが
    生まれた
反復戦隊
イテレーター
Iteratorパターン
あらすじ
●   世界の片隅でとあるクソプログラマーにより
    偶然作られた唯一神シングルトン。数年後こ
    れが世界を震撼させるほど凶悪なクソ設計で
    あることが発覚し、プロジェクトを混乱に陥
    れる。月日は流れ、世界は荒廃し、モヒカン
    がヒャッハー (ry
●   五反田のでり坊で飲んだくれていた TDD 伝道
    師 t-wada は、世界を救うため先人の知識の集
    大成となる新たな概念を生み出したのだっ
    た。
すべてのはじまり
Iteratorパターン
反復戦隊イテレーター登場人物
●   唯一神シングルトン
●   悪の組織ファサード
●   調停者メディエーター
●   観察者オブザーバー
●   ぬるぽ
    ●   敵の雑魚キャラ
    ●   「ガッ」という音とともに一撃でやられる
反復戦隊イテレーター必殺技
●   絶対防御シンクロナイズドブロック
●   バッファードアウトプットストリーム
●   ThreadDeath
●   技表
    ●   Java 言語仕様
    ●   Javadoc
Iterator パターン
「反復」という概念
をオブジェクト化
List list = ...;

// while 文で書く
Iterator it = list.iterator();
while (it.hasNext()) {
    Object o = it.next();
    ...;
}

// for 文で書くと it のスコープをせまくできる
for (Iterator it = list.iterator(); it.hasNext(); ) {
    Object o = it.next();
    ...;
}

// for-each loop だと Iterator がコード上から消える
for (Object o : list) {
    ...;
}
ループインデックス
 どうしてますか?
List list = ...;

// インデックスが欲しいときは素直にマニュアルで管理?
Iterator it = list.iterator();
int i = 0;
while (it.hasNext()) {
    Object o = it.next();
    i++;
    ...;
}

// List なら ListIterator という手があるよ
ListIterator it = list.listIterator();
while (it.hasNext()) {
    Object o = it.next();
    int i = it.previousIndex();
    ...;
}
Concurrent
Modification
 Exception
ConcurrentModificationException
●   Iterator で反復中に元の Collection に要素の追
    加もしくは削除を行うと発生
●   シングルスレッドの場合
    ●   Iterator.remove() を使うべきところで List.remove()
        を呼んでしまうというミス
●   マルチスレッドの場合
    ●   synchronized ブロックでガードする
    ●   反復対象の Collection の複製を作ってから反復する
Iterator まとめ
●   「反復」オブジェクト
●   ListIterator かわいいよ
●   ConcurrentModificationException 気をつけて

More Related Content

More from nekop

JBoss AS7 rev3
JBoss AS7 rev3JBoss AS7 rev3
JBoss AS7 rev3nekop
 
Infinispan - Open Source Data Grid rev2
Infinispan - Open Source Data Grid rev2Infinispan - Open Source Data Grid rev2
Infinispan - Open Source Data Grid rev2nekop
 
JBoss AS7 rev2
JBoss AS7 rev2JBoss AS7 rev2
JBoss AS7 rev2nekop
 
JBoss AS7
JBoss AS7JBoss AS7
JBoss AS7nekop
 
CDI, Seam 3 and Forge
CDI, Seam 3 and ForgeCDI, Seam 3 and Forge
CDI, Seam 3 and Forgenekop
 
Infinispan - Open Source Data Grid
Infinispan - Open Source Data GridInfinispan - Open Source Data Grid
Infinispan - Open Source Data Gridnekop
 
Proxy
ProxyProxy
Proxynekop
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patternsnekop
 
mod_cluster
mod_clustermod_cluster
mod_clusternekop
 

More from nekop (9)

JBoss AS7 rev3
JBoss AS7 rev3JBoss AS7 rev3
JBoss AS7 rev3
 
Infinispan - Open Source Data Grid rev2
Infinispan - Open Source Data Grid rev2Infinispan - Open Source Data Grid rev2
Infinispan - Open Source Data Grid rev2
 
JBoss AS7 rev2
JBoss AS7 rev2JBoss AS7 rev2
JBoss AS7 rev2
 
JBoss AS7
JBoss AS7JBoss AS7
JBoss AS7
 
CDI, Seam 3 and Forge
CDI, Seam 3 and ForgeCDI, Seam 3 and Forge
CDI, Seam 3 and Forge
 
Infinispan - Open Source Data Grid
Infinispan - Open Source Data GridInfinispan - Open Source Data Grid
Infinispan - Open Source Data Grid
 
Proxy
ProxyProxy
Proxy
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
 
mod_cluster
mod_clustermod_cluster
mod_cluster
 

Iteratorパターン

  • 2. 2010 年 11 月 18 日 新たなヒーローが 生まれた
  • 5. あらすじ ● 世界の片隅でとあるクソプログラマーにより 偶然作られた唯一神シングルトン。数年後こ れが世界を震撼させるほど凶悪なクソ設計で あることが発覚し、プロジェクトを混乱に陥 れる。月日は流れ、世界は荒廃し、モヒカン がヒャッハー (ry ● 五反田のでり坊で飲んだくれていた TDD 伝道 師 t-wada は、世界を救うため先人の知識の集 大成となる新たな概念を生み出したのだっ た。
  • 8. 反復戦隊イテレーター登場人物 ● 唯一神シングルトン ● 悪の組織ファサード ● 調停者メディエーター ● 観察者オブザーバー ● ぬるぽ ● 敵の雑魚キャラ ● 「ガッ」という音とともに一撃でやられる
  • 9. 反復戦隊イテレーター必殺技 ● 絶対防御シンクロナイズドブロック ● バッファードアウトプットストリーム ● ThreadDeath ● 技表 ● Java 言語仕様 ● Javadoc
  • 12. List list = ...; // while 文で書く Iterator it = list.iterator(); while (it.hasNext()) { Object o = it.next(); ...; } // for 文で書くと it のスコープをせまくできる for (Iterator it = list.iterator(); it.hasNext(); ) { Object o = it.next(); ...; } // for-each loop だと Iterator がコード上から消える for (Object o : list) { ...; }
  • 14. List list = ...; // インデックスが欲しいときは素直にマニュアルで管理? Iterator it = list.iterator(); int i = 0; while (it.hasNext()) { Object o = it.next(); i++; ...; } // List なら ListIterator という手があるよ ListIterator it = list.listIterator(); while (it.hasNext()) { Object o = it.next(); int i = it.previousIndex(); ...; }
  • 16. ConcurrentModificationException ● Iterator で反復中に元の Collection に要素の追 加もしくは削除を行うと発生 ● シングルスレッドの場合 ● Iterator.remove() を使うべきところで List.remove() を呼んでしまうというミス ● マルチスレッドの場合 ● synchronized ブロックでガードする ● 反復対象の Collection の複製を作ってから反復する
  • 17. Iterator まとめ ● 「反復」オブジェクト ● ListIterator かわいいよ ● ConcurrentModificationException 気をつけて