<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Java</title><link>http://blogs.wankuma.com/nagise/category/1356.aspx</link><description>Java</description><managingEditor>凪瀬</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>凪瀬</dc:creator><title>java-jaでTDDでペアプロUst中継をしました</title><link>http://blogs.wankuma.com/nagise/archive/2009/06/08/174448.aspx</link><pubDate>Mon, 08 Jun 2009 00:55:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2009/06/08/174448.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/174448.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2009/06/08/174448.aspx#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/174448.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/174448.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://java-ja.yoshiori.org/index.php?%E7%AC%AC%E5%8D%81%E4%BA%94%E5%9B%9E"&gt;第二回チキチキ 日本ペアプログラミングの会java-ja支部会（仮）&lt;/a&gt;に参加してきました。会場を提供してくださった株式会社ドワンゴ様、本当にありがとうございました。&lt;/p&gt;

&lt;p&gt;TDD(test-driven development)での開発ってどんな感じ？というセッションをまず&lt;a href-"http://d.hatena.ne.jp/t-wada/"&gt;t_wada&lt;/a&gt;氏がやって、
踏まえたうえでペアプログラミングで実践して体感するという流れ。&lt;/p&gt;

&lt;p&gt;ペアプロの相手を探すフェーズがさながら合コンかお見合いパーティといった風情。私は&lt;a href="http://d.hatena.ne.jp/Yamashiro0217/"&gt;@yamashiro&lt;/a&gt;氏とペアを組みました。
@yamashiro氏はTDD慣れしているんだけど、僕のLet'sノートのキーボードと相性が悪かったのが残念。僕らのペアプロ姿はUst中継で放映されていましたよ。&lt;/p&gt;

&lt;p&gt;セッション内容は@monjudoh氏が&lt;a href="http://d.hatena.ne.jp/monjudoh/20090606/1244263737"&gt;リアルタイムにblogに上げた奴&lt;/a&gt;とかたくさんあるので割愛。&lt;/p&gt;

&lt;h4&gt;成果物&lt;/h4&gt;

&lt;p&gt;テーマはプライオリティキューを作ろう、というもの。ぶっちゃけてしまえば、Java5からある&lt;a href="http://www.j2ee.me/javase/ja/6/docs/ja/api/java/util/PriorityQueue.html"&gt;PriorityQueue&lt;/a&gt;
を自作しましょうというネタです。&lt;/p&gt;

&lt;p&gt;作業のステップは以下のような感じ。記憶を元に書いているので怪しいです。実際にはもっと細かいステップもいろいろあります。Ust中継を見ていた人はわかったんじゃないかな。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;まず単なるキューを実装する方針にしよう
&lt;li&gt;ひとつのオブジェクトを入れて出すところまでをまず作る
  &lt;ol&gt;
    &lt;li&gt;まずはテストを書いてJUnit(※自動テスト用ツール)を実行してバーをレッド(※自動テストが失敗した状態)にしないといけない
    &lt;li&gt;キューに入れるテストコードをまず書く
    &lt;li&gt;コンパイルエラーになるのでCtrl+1 (※エディタはEclipse3.4)を使って実装をCtrl+1で補完
    &lt;li&gt;とりあえずJUnitのテストが通過してグリーンになる（pushは値を返さないので空実装でも関係ない）
    &lt;li&gt;キューから取り出す部分のテストコードをまず書く
    &lt;li&gt;コンパイルが通るように実装コードを補完して、JUnitを実行して失敗、バーが赤くなる
    &lt;li&gt;Object型フィールド変数を作って格納してget()で返すという簡単な作り
    &lt;li&gt;JUnitを実行して成功、バーがグリーンになる
  &lt;/ol&gt;
&lt;li&gt;次に複数個の入れれるようにしてちゃんとキューにしよう
  &lt;ol&gt;
    &lt;li&gt;テストケースを書き足して、２個入れて２個出すようにする
    &lt;li&gt;バーがレッドになる
    &lt;li&gt;フィールドをList型に変更
    &lt;li&gt;get()の実装は return this.data.remove(0); でいいよね(&lt;a href="http://www.j2ee.me/javase/ja/6/docs/ja/api/java/util/List.html#remove(int)"&gt;List#remove(int)&lt;/a&gt;を利用)
    &lt;li&gt;バーがグリーンになる
  &lt;/ol&gt;
&lt;li&gt;ジェネリクス対応させちゃいたいんでここで入れちゃおう
  &lt;ol&gt;
    &lt;li&gt;コンストラクタに型変数を渡すようにテストコードを修正。コンパイルエラー
    &lt;li&gt;コンストラクタに型変数&lt;T&gt;を追加
    &lt;li&gt;あー。このへんのリファクタリングで自動でやれないんだよなー。(2009年6月現在)
    &lt;li&gt;手動で実装を載せるしかない
  &lt;/ol&gt;
&lt;li&gt;さて、プライオリティを渡せるようにしますか。コンストラクタで渡すでいいよね
&lt;li&gt;Comparatorを渡すようにして順序付けを外から指定できるのがいいよね
  &lt;ol&gt;
    &lt;li&gt;コンストラクタにComparatorを渡して比較をするテストケースを書く
    &lt;li&gt;コンパイルエラーになるので実装をCtrl+1で補完
    &lt;li&gt;バーがレッド。さて、グリーンにするにはどうしようか？
    &lt;li&gt;ちょっと小さい手ごろなステップが思い浮かばないので一気に実装しちゃう
    &lt;li&gt;ThreeSetを使って実装しちゃえば速いんじゃない？
    &lt;li&gt;実装できた。テストを実行すると…あれ、レッド？
    &lt;li&gt;あー。同じ値を入れたらTreeSetだとひとつにまとめられちゃうからか
  &lt;/ol&gt;
&lt;li&gt;ダメだ、TreeSet方式は却下
&lt;li&gt;ちゃんとダメなケースをはじけたわけだからTDDがうまく機能したね
&lt;li&gt;Listにケツから突っ込んで、比較しながら手前に向かって追い越しをやる方法でどうだろう？
&lt;li&gt;push()時点でキューの中の状態を正しい状態に保つ感じ
  &lt;ol&gt;
    &lt;li&gt;まずはTreeSet方式を差し戻す。Subversion使っておけばよかった orz (現地の環境がトラブル多そうだったので避けたのが敗因)
    &lt;li&gt;ただのList&lt;T&gt;にしよう
    &lt;li&gt;後ろから順に比較しないといけないから逆順にループしないと
    &lt;li&gt;&lt;a href="http://www.j2ee.me/javase/ja/6/docs/ja/api/java/util/Collections.html#reverse(java.util.List)"&gt;Collections#reverse()&lt;/a&gt;を使う？
    &lt;li&gt;挿入するときにループカウンタ必要になるから拡張for文つかうのはあきらめよう
    &lt;li&gt;compare()の結果ってどっちが大きいときに正だっけ？ｗ
  &lt;/ol&gt;
&lt;li&gt;出来上がり。なんか拡張するテーマ決めよう
&lt;li&gt;SQLのorder by みたいな感じで複数のキーを優先度設定できるようなのどう？
&lt;li&gt;よしそれで行こう…って時間切れか！
&lt;/ol&gt;

&lt;h4&gt;ソースコード&lt;/h4&gt;

&lt;p&gt;ソースをそのままで張ろうかとも思ったんだけど、コメントないなー orz　普段はjavadocとかコメントがりがり書く派なんだけど、なんかすっかり忘れてました。&lt;/p&gt;

&lt;p&gt;上で時間切れになった後、「各自の荷物片付けてー」とか言われている最中に実装をやっちゃったので、実装完了版にコメントを追記したソースを載せます。&lt;/p&gt;

&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;package&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;queue;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;static&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;org.junit.Assert.*;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;java.awt.Point;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;java.util.Comparator;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;org.junit.Test;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;PriorityQueueTest&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#646464"&gt;@Test&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;void&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;testname&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;throws&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Exception&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;PriorityQueue&amp;lt;String&amp;gt;&amp;nbsp;queue&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;PriorityQueue&amp;lt;String&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;String&amp;nbsp;expectedObj1&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;String&amp;nbsp;expectedObj2&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;queue.push&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;expectedObj1&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;queue.push&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;expectedObj2&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;assertEquals&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;expectedObj1,&amp;nbsp;queue.get&lt;/font&gt;&lt;font color="#000000"&gt;())&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;assertEquals&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;expectedObj2,&amp;nbsp;queue.get&lt;/font&gt;&lt;font color="#000000"&gt;())&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#646464"&gt;@Test&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;void&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;プライオリティを設定できる&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;throws&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Exception&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;PriorityQueue&amp;lt;String&amp;gt;&amp;nbsp;queue&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;PriorityQueue&amp;lt;String&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Comparator&amp;lt;String&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;(){&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#646464"&gt;@Override&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;int&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;compare&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;String&amp;nbsp;o1,&amp;nbsp;String&amp;nbsp;o2&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;o2.compareTo&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;o1&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}})&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;String&amp;nbsp;expectedObj1&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;b&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;String&amp;nbsp;expectedObj2&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;a&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;queue.push&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;expectedObj1&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;queue.push&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;expectedObj2&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;assertEquals&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;expectedObj2,&amp;nbsp;queue.get&lt;/font&gt;&lt;font color="#000000"&gt;())&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;assertEquals&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;expectedObj1,&amp;nbsp;queue.get&lt;/font&gt;&lt;font color="#000000"&gt;())&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#646464"&gt;@Test&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;void&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;複数の優先度を設定できる&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;throws&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Exception&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;PriorityQueue&amp;lt;Point&amp;gt;&amp;nbsp;queue&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;PriorityQueue&amp;lt;Point&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Comparator&amp;lt;Point&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#646464"&gt;@Override&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;int&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;compare&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Point&amp;nbsp;o1,&amp;nbsp;Point&amp;nbsp;o2&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;o2.x&amp;nbsp;-&amp;nbsp;o1.x;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}}&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Comparator&amp;lt;Point&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#646464"&gt;@Override&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;int&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;compare&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Point&amp;nbsp;o1,&amp;nbsp;Point&amp;nbsp;o2&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;o2.y&amp;nbsp;-&amp;nbsp;o2.y;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}})&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Point&amp;nbsp;p1&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Point&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#990000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#990000"&gt;4&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Point&amp;nbsp;p2&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Point&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#990000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#990000"&gt;3&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;queue.push&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;p1&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;queue.push&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;p2&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;assertEquals&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;p1,&amp;nbsp;queue.get&lt;/font&gt;&lt;font color="#000000"&gt;())&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;assertEquals&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;p2,&amp;nbsp;queue.get&lt;/font&gt;&lt;font color="#000000"&gt;())&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Point&amp;nbsp;p3&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Point&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#990000"&gt;2&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#990000"&gt;2&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;queue.push&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;p1&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;queue.push&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;p3&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;assertEquals&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;p1,&amp;nbsp;queue.get&lt;/font&gt;&lt;font color="#000000"&gt;())&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;assertEquals&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;p3,&amp;nbsp;queue.get&lt;/font&gt;&lt;font color="#000000"&gt;())&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;


&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;package&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;queue;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;java.util.ArrayList;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;java.util.Comparator;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;java.util.Iterator;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;import&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;java.util.List;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#3f5fbf"&gt;/**&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;2009.06.06&amp;nbsp;第二回チキチキ&amp;nbsp;日本ペアプログラミングの会java-ja支部会（仮）&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;TDDでプライオリティキューの実装をした成れの果て。&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;TDDで作ったものは複数優先度がやりかけだったので、お片づけ時間中にnagiseが完成させ、&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;blog掲載時に読む人を考慮してnagiseが解説のコメントを足したもの。&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;&lt;/font&gt;&lt;font color="#7f9fbf"&gt;@author&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;yamashiro,&amp;nbsp;nagise&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;&lt;/font&gt;&lt;font color="#7f9fbf"&gt;@param&amp;nbsp;&lt;/font&gt;&lt;font color="#7f7f9f"&gt;&amp;lt;T&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;格納するデータ型&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;PriorityQueue&amp;lt;T&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;List&amp;lt;T&amp;gt;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;ArrayList&amp;lt;T&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;List&amp;lt;Comparator&amp;lt;T&amp;gt;&amp;gt;&amp;nbsp;comparators;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;自然順序付けによるプライオリティのキューを作成する&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;PriorityQueue&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.comparators&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;ArrayList&amp;lt;Comparator&amp;lt;T&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.comparators.add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Comparator&amp;lt;T&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#646464"&gt;@SuppressWarnings&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;unchecked&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#646464"&gt;@Override&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;int&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;compare&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;T&amp;nbsp;o1,&amp;nbsp;T&amp;nbsp;o2&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Comparable&amp;nbsp;c1&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Comparable&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;o1;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;c1.compareTo&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;o2&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;})&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;指定したComparatorをプライオリティ判定に用いるキューを作成する&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;&lt;/font&gt;&lt;font color="#7f9fbf"&gt;@param&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;comparator&amp;nbsp;プライオリティ判定に用いるキュー&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;PriorityQueue&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Comparator&amp;lt;T&amp;gt;&amp;nbsp;comparator&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.comparators&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;ArrayList&amp;lt;Comparator&amp;lt;T&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.comparators.add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;comparator&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;複数優先度を持つキューを作成する&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;&lt;/font&gt;&lt;font color="#7f9fbf"&gt;@param&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;comparators&amp;nbsp;第一優先度判定用Comparator、第二優先度判定用Comparatorといった形で並べる&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;PriorityQueue&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Comparator&amp;lt;T&amp;gt;&amp;nbsp;...&amp;nbsp;comparators&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.comparators&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;ArrayList&amp;lt;Comparator&amp;lt;T&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;for&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Comparator&amp;lt;T&amp;gt;&amp;nbsp;c&amp;nbsp;:&amp;nbsp;comparators&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.comparators.add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;c&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;T&amp;nbsp;get&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Iterator&amp;lt;T&amp;gt;&amp;nbsp;iterator&amp;nbsp;=&amp;nbsp;data.iterator&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;iterator.hasNext&lt;/font&gt;&lt;font color="#000000"&gt;())&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;T&amp;nbsp;next&amp;nbsp;=&amp;nbsp;iterator.next&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.data.remove&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;next&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;next;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;null&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;void&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;push&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;T&amp;nbsp;obj&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;挿入時に末尾から前に向かって順に優先度判定をして、しかるべき位置に挿入する&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;int&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;i&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.data.size&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;第一優先度からループして、等しい値が現れたら次の優先度で比較&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;comparatorLoop:&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;for&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Comparator&amp;lt;T&amp;gt;&amp;nbsp;c&amp;nbsp;:&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.comparators&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;末尾から前に向かって湯鮮度判定するから逆ループ&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;for&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;;i&amp;nbsp;&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#990000"&gt;0&lt;/font&gt;&lt;font color="#000000"&gt;;&amp;nbsp;i--&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;T&amp;nbsp;target&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.data.get&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;i&amp;nbsp;-&lt;/font&gt;&lt;font color="#990000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;現在の優先度が等しければ、次の優先度での比較に移行&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;c.compare&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;obj,&amp;nbsp;target&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;==&amp;nbsp;&lt;/font&gt;&lt;font color="#990000"&gt;0&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;continue&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;comparatorLoop;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;優先度を超えそうな境目を見つけたら、そこが安住の地&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;c.compare&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;obj,&amp;nbsp;target&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;=&amp;nbsp;&lt;/font&gt;&lt;font color="#990000"&gt;0&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;break&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;comparatorLoop;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.data.add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;i,&amp;nbsp;obj&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;
&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/174448.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>複数通貨のMoneyをジェネリクスで作る</title><link>http://blogs.wankuma.com/nagise/archive/2009/05/19/173180.aspx</link><pubDate>Tue, 19 May 2009 00:54:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2009/05/19/173180.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/173180.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2009/05/19/173180.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/173180.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/173180.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://kanazawa-process.g.hatena.ne.jp/katzchang/20090517/1242513168"&gt;Kanazawa.process&lt;/a&gt;では&lt;a href="http://d.hatena.ne.jp/asin/4894717115"&gt;テスト駆動開発入門&lt;/a&gt;を読んで、テスト駆動開発を学びました。その本でのテスト駆動開発のサンプルとして挙がっていたテーマは複数通貨のMoneyを作るというものでした。&lt;/p&gt;

&lt;p&gt;Dollarという米ドルを表現するオブジェクトを作り、Francというスイス・フランを表すオブジェクトを作り、そしてMoneyというオブジェクトに統合していくというリファクタリングの過程を経ています。&lt;/p&gt;

&lt;p&gt;これをジェネリクスを使って設計したらどうなるでしょうか。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;abstract&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;T&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;T&amp;gt;&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;abstract&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;T&amp;nbsp;add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;?&amp;gt;&amp;nbsp;m&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Moneyオブジェクトに演算用のメソッドadd()を定義します。引き算や掛け算など要求に合わせて各種用意するといいでしょう。&lt;/p&gt;

&lt;p&gt;&lt;font color="#000000"&gt;Money&amp;lt;T&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;T&amp;gt;&amp;gt;
という型変数の宣言方法は&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/05/25/139308.aspx"&gt;自己言及するジェネリクス&lt;/a&gt;の稿で
取り上げた手法です。add()の戻り型をTとしておくことで具象型自身の型を返させることができます。&lt;/p&gt;

&lt;p&gt;これをDollarやFrancでオーバーライドして実装します。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Dollar&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;Dollar&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#646464"&gt;@Override&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Dollar&amp;nbsp;add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;?&amp;gt;&amp;nbsp;m&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;...&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;こうすることで、Dollarのadd()はDollar型で返るわけです。
しかし、これだけだとDollarやFrancといった通貨単位ごとにadd()の実装を施さねばなりません。
protectedなファクトリーメソッドを用意して、オブジェクトの生成を具象型に委譲することで
スーパークラスであるMoney型で統一的にadd()を記述することができます。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;abstract&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;T&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;T&amp;gt;&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;為替レート&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Map&amp;lt;Class&amp;lt;?&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;?&amp;gt;&amp;gt;,&amp;nbsp;Map&amp;lt;Class&amp;lt;?&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;?&amp;gt;&amp;gt;,&amp;nbsp;Double&amp;gt;&amp;gt;&amp;nbsp;rateMap;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;値&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;protected&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;double&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;value;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;加算メソッドの共通実装&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;T&amp;nbsp;add&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Money&amp;lt;?&amp;gt;&amp;nbsp;m&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;double&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;rate&amp;nbsp;=&amp;nbsp;rateMap.get&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.getClass&lt;/font&gt;&lt;font color="#000000"&gt;())&lt;/font&gt;&lt;font color="#000000"&gt;.get&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;m.getClass&lt;/font&gt;&lt;font color="#000000"&gt;())&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;getInstance&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.value&amp;nbsp;+&amp;nbsp;m.value&amp;nbsp;*&amp;nbsp;rate&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;具象型の生成&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;protected&amp;nbsp;abstract&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;T&amp;nbsp;getInstance&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;double&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;value&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;コンストラクタ&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;protected&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Money&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;double&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;value&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.value&amp;nbsp;=&amp;nbsp;value;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;こうした手法で通貨単位ごとに型を作って何が嬉しいかと言えば、ドル建てである場所にスイス・フランの型が紛れ込んだ場合に
コンパイルエラーにすることができるという点です。&lt;/p&gt;

&lt;p&gt;設計にはいろんな手法がありますし、それぞれにメリット、デメリットがあるので要求に合わせて柔軟に選べるようにしたいものですね。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/173180.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>Kanazawa.processで挙がった話題の補足</title><link>http://blogs.wankuma.com/nagise/archive/2009/05/19/173177.aspx</link><pubDate>Tue, 19 May 2009 00:19:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2009/05/19/173177.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/173177.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2009/05/19/173177.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/173177.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/173177.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://kanazawa-process.g.hatena.ne.jp/katzchang/20090517/1242513168"&gt;Kanazawa.process&lt;/a&gt;というテスト駆動開発の勉強会が開催されたので参加してきました。話題に上がったネタの技術的な部分をいくつか補足しておきます。&lt;/p&gt;

&lt;h4&gt;副作用&lt;/h4&gt;

&lt;p&gt;この勉強会ではテキストとして&lt;a href="http://d.hatena.ne.jp/asin/4894717115"&gt;テスト駆動開発入門&lt;/a&gt;を用いました。
第一章で出てくる「副作用」という表現。あまりにも一般用語然としていますが、プログラミングの専門用語として「副作用」と言う場合、
状態の変更によって得られる結果が変わることを言います。
wikipediaにも&lt;a href="http://ja.wikipedia.org/wiki/%E5%89%AF%E4%BD%9C%E7%94%A8_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0)"&gt;
副作用 (プログラム)&lt;/a&gt;という項がありますね。変数の破壊的代入というような言い方もします。&lt;/p&gt;

&lt;p&gt;関数型言語では関数が副作用を持たない、つまり、同じオブジェクトを引数に渡したとしても、オブジェクトの状態が変わったことによって
メソッドの呼び出し結果が異なる、といったことが起きません。そのために変数への代入は初期化のみが許されて、
再代入(破壊的代入)は許されないという特色があります。&lt;/p&gt;

&lt;p&gt;その利点にあやかるべく、値を表すオブジェクト（バリューオブジェクト）には
&lt;a href="http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB"&gt;Immutableパターン&lt;/a&gt;
というデザインパターンが適用されることが多くあります。
Javaの標準APIでは、Integerなどのプリミティブ型に対するラッパー型や、BigDecimal型などがこうした設計になっています。
これらは不変オブジェクトと表現されることもあります。&lt;/p&gt;

&lt;p&gt;今のJavaには破壊的代入をコンパイラにチェックさせる機構がありませんが、JavaVM上で動作するScalaなど、
関数型の流れも汲み入れた新しい言語ではこれをサポートする機構が存在します。
Scalaの場合は変数宣言にvarとvalというキーワードで再代入可能な変数と再代入不可の変数を使い分けることができます。
&lt;a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20080708/310424/"&gt;IT Proの記事&lt;/a&gt;がわかりやすいでしょうか。&lt;/p&gt;

&lt;p&gt;また、Java7での拡張に含まれる予定の&lt;a href="http://jcp.org/en/jsr/detail?id=305"&gt;JSR 305&lt;/a&gt;では
バグを根絶するための各種アノテーションの提案がされています。
&lt;a href="http://journal.mycom.co.jp/column/jsr/016/index.html"&gt;マイコミの記事&lt;/a&gt;が詳しいですね。
この候補として@Immutableというものも候補に挙がっており、Java7ではコンパイラでチェックできるようになるかもしれません。&lt;/p&gt;

&lt;h4&gt;不変オブジェクトとGC&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.ibm.com/developerworks/jp/java/library/j-jtp04223/"&gt;Javaの理論と実践: パフォーマンスの都市伝説&lt;/a&gt;
でも述べられているように、不変オブジェクトを用いることによって目に見えるようなパフォーマンスの劣化が起こることはありません。
90%のオブジェクトは作られてすぐに廃棄されると言われており、近年のGC(ガーベッジコレクション)は世代管理をして
こうしたライフサイクルの短いオブジェクトの回収を効率的に行えるように設計されています。&lt;/p&gt;

&lt;p&gt;オブジェクトの再利用を行う機構を作ったとしても、不変オブジェクトの生成と破棄を行うスタイルと
目に見えるほどのパフォーマンスの改善を得ることはなかなかできません。
下手に頑張ったところで残るのは再利用や修正のしにくい醜い設計のプログラムだけです。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.wankuma.com/nagise/archive/2009/02/03/167335.aspx"&gt;ソフトウェア品質の12の属性&lt;/a&gt;で取り上げたとおり、
パフォーマンスチューニングによる効率性の向上のためには、柔軟性、相互接続性、保守性、移植性、信頼性、堅牢性、試験性、使用性が犠牲になります。
そこまでの多大な犠牲と、パフォーマンスチューニングにかける時間、労力、そしてわずかばかりの効率性が釣り合うのかを冷静に判断してください。&lt;/p&gt;

&lt;h4&gt;大規模開発と静的解析&lt;/h4&gt;

&lt;p&gt;大規模特有の難しさと言うのは「人」が増えることによる開発の難しさなんですよね。
多くの人が関わって作業をすると言ったときに、メンバーの技術的ばらつきは大きくなる。
作業のやり方を統一することも難しいし、何より人間はヒューマンエラーを起こすのです。
これを漏れなく拾うことの難しさ、そしてフィードバックして個々人をレベルアップさせることの難しさがあります。&lt;/p&gt;

&lt;p&gt;まぁ、ぶっちゃけて言えば手が回らない。なので、人海戦術はやめにして、機械化しましょう。
システム開発を機械化で高生産にするわけです。ビバ産業革命！&lt;/p&gt;

&lt;p&gt;技術を持った人が注意深く作業する必要のある単純作業なんてのは、機械にやらせてしまいましょう。
そう、リファクタリング機能です。EclipseやNetBeansには高度で信頼できるリファクタリング機能が搭載されています。
静的な構文解析に裏打ちされた安定した機械的なリファクタリングを活用しましょう。&lt;/p&gt;

&lt;p&gt;FindBugsプラグインなどの静的解析ツールによる機械的なコードレビューを活用しましょう。
命名規約やフォーマットのチェックなんてのはCheckStyleプラグインで機械的にチェックしてしまいましょう。
データ型の不一致をあぶり出す机上デバッグなんてやめて、ジェネリクスを使ってコンパイラでの静的型チェックをしましょう。&lt;/p&gt;

&lt;p&gt;技術を持った人が注意深く、ヒューマンエラーと戦いながら退屈な単純作業をやらなきゃいけないなんて
そんな低生産なやり方はガーベッジコレクションに回収させてしまいましょう。
もっとも、頭の固いエライヒトがいつまでもそのやり方を参照しているとリークしていつまでも回収できないのですけどね。&lt;/p&gt;



&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/173177.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>java-ja富山</title><link>http://blogs.wankuma.com/nagise/archive/2009/04/05/170807.aspx</link><pubDate>Sun, 05 Apr 2009 23:25:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2009/04/05/170807.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/170807.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2009/04/05/170807.aspx#Feedback</comments><slash:comments>96</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/170807.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/170807.aspx</trackback:ping><description>&lt;p&gt;4/4(土)に&lt;a href="http://java-ja.yoshiori.org/index.php?%E7%AC%AC%E5%8D%81%E5%9B%9B%E5%9B%9E"&gt;第十四回java-ja勉強会 - 第1回チキチキ 地方巡業withひがやすを飲み会in富山&lt;/a&gt;を開催しました。遠路はるばる富山までスピーカーしにきてくださった
&lt;a href="http://d.hatena.ne.jp/higayasuo/"&gt;ひが&lt;/a&gt;さん、
&lt;a href="http://d.hatena.ne.jp/t_yano/"&gt;矢野&lt;/a&gt;さん、
&lt;a href="http://d.hatena.ne.jp/yone098/"&gt;米林&lt;/a&gt;さん、
&lt;a href="http://yoshiori.org/"&gt;ヨシオリ&lt;/a&gt;さん、本当にありがとうございました。&lt;/p&gt;

&lt;h4&gt;凪瀬のジェネリクスの話&lt;/h4&gt;

&lt;p&gt;わんくま大阪でやったのと同じネタなんですが、時間を切り詰めてたので伝えたいところをうまく伝えられなかったかなぁと反省。&lt;/p&gt;

&lt;p&gt;Javaのジェネリクスのややこしい部分は座学ですんなりわかるものじゃなくて、自分で四苦八苦してコード書いてみないと分からない
わけですが、苦労してジェネリクスを学んだ先にはより設計の幅が広がって幸せになれるから是非学ぼうという話をしようという
目論見だったのですけども、サンプルコードとかの説明とかがうまくやれなかったな、と。
テーマの取捨選択が難しいですね。変な切り落とし方しちゃったかなぁ…。&lt;/p&gt;

&lt;h4&gt;矢野さんのアニメーションの話&lt;/h4&gt;

&lt;p&gt;詳しいメモを取っていなかったのだけど、たぶん&lt;a href="https://timingframework.dev.java.net/"&gt;このへん&lt;/a&gt;の奴。Timing Framework。
具体的にどれとかって話はきっと矢野さんがエントリを書いてくれるでしょう。&lt;/p&gt;

&lt;p&gt;アニメーションの移動開始、終了間際の加速度の制御みたいな部分とか地味に面倒で難しいテーマ。書籍
&lt;a href="http://www.amazon.co.jp/dp/4894712830"&gt;Filthy Rich Clients&lt;/a&gt;の第三部あたりの話題。
矢野さんが言うには「あの本にはアニメーションは難しいから俺の作ったフレームワークを使え的なことが書いてある」
とかなんとか。まぁ確かに。&lt;/p&gt;

&lt;p&gt;自前で頑張ってチューニングを試みたらむしろ遅くなった、今のSwingはチューニングが凄いから
下手に頑張るよりそのまま何も考えずに描画した方が速い、みたいな話をしていて最近の画像処理にはついていけないやと思った次第。
自分はポリゴンとかの描画アルゴリズムとか勉強したことはあるけどパフォーマンスチューニングに凝ったことがないしなぁ。
あちこちで聞くけども本当に近年のSwingは速いらしいよ。&lt;/p&gt;

&lt;h4&gt;ひがさんのAOPの話&lt;/h4&gt;

&lt;p&gt;今回はひがやすを飲み会（東京都、仙台市、札幌市に続く第４回目。
&lt;a href="http://jibun.atmarkit.co.jp/lcom01/rensai/comrade11/comrade01.html"&gt;参考記事&lt;/a&gt;）
も兼ねているわけで、真打登場といった感じ。&lt;/p&gt;

&lt;p&gt;Slim3あたりのAOPのえらくマニアックな話をして頂きました。自分は大喜びで食いついていたけど、
他の参加者の人は大丈夫だったかしら。&lt;/p&gt;

&lt;p&gt;AOPでのパフォーマンス向上のためのいろいろな工夫を聞いて感心することしきり。
実行時に通るAOPのための仕掛けをいかに薄くするかという話で、
実装方法論の部分で話題に上がってたのは確か&lt;a href="http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/ClassLoader.html#defineClass(java.lang.String,%20byte[],%20int,%20int)"&gt;ClassLoader#defineClass()&lt;/a&gt;
あたりでロード時に書き換える話とか、&lt;a href="http://www.csg.is.titech.ac.jp/~chiba/javassist/"&gt;Javassist&lt;/a&gt;
で継承クラスを作るとかの話かな。自分で実装してみたことないので間違ってるかもしれません。&lt;/p&gt;

&lt;p&gt;自分はClassLoader#defineClass()でクラスロード時にウィービングする手法と、
コンパイル時でのウィービングする手法ぐらいしか理解していなかったのでこのテーマの深遠さが覗けて興奮しましたね。&lt;/p&gt;

&lt;h4&gt;よねさんの１つめの話&lt;/h4&gt;

&lt;p&gt;JavaとAIRの間で通信したりする話。あとはJavaFXとかJavaScriptとかもあって相互に通信しまくり。
こういう部分で何が可能なのかを知っておくことはトータルのシステム構成を考える上での重要な前提知識だと思うので
非常に興味深く聞いていました。&lt;/p&gt;

&lt;p&gt;そうそう、よねさんのAppletは起動が超速かったデスヨー（棒読み&lt;/p&gt;

&lt;h4&gt;ヨシオリさんのTDDの話&lt;/h4&gt;

&lt;p&gt;テスト駆動開発 (test-driven development; TDD)の話。テスト手法とかはコレという正解が確立されていない感じで
みんながいろいろと模索しているようなテーマだから議論が盛り上がる、盛り上がる。ust中継してたので
和田さんのツッコミとかもあって面白かった。&lt;/p&gt;

&lt;p&gt;僕もテスト駆動のテストって品質を担保するテストだと思っていたクチなので、
そういうテストじゃないんだという話に目から鱗。&lt;/p&gt;

&lt;p&gt;「テスト駆動開発は宗教である」「コード＝神」とか名言が飛び交う面白いセッションでした。
今日も誰かがモニタに向かって邪神を生み出そうとしてたりするのかな。&lt;/p&gt;

&lt;h4&gt;よねさんの２つめの話&lt;/h4&gt;

&lt;p&gt;T2とかの話。今日は相方の片山さんはいなかったけども
&lt;a href="http://d.hatena.ne.jp/yone098/20090315/1237082817"&gt;SeasarConference2009Whiteのときの&lt;/a&gt;
の話。僕はSeasarConのときに聞いてたのでテーマを復習した感じでしたね。&lt;/p&gt;

&lt;h4&gt;今回の失敗点&lt;/h4&gt;

&lt;p&gt;ust中継をやっていたのですが、Webカメラで写すとプロジェクタの文字が白飛びして見えない！
その上、マイクが中継機になってたヨシオリさんのノートPCのマイクになってて音が凄く拾いにくい！&lt;/p&gt;

&lt;p&gt;ustでの中継だと空間的な場を伝えるには便利なんだけど、勉強会とかでの資料とかは解像度的に全然読めないのが常。
この辺どうにかならないんですかね。次会には機材としてマイクを準備しておきたいところです。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/170807.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>ボクシング変換とMapのキー</title><link>http://blogs.wankuma.com/nagise/archive/2009/03/02/169096.aspx</link><pubDate>Mon, 02 Mar 2009 21:59:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2009/03/02/169096.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/169096.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2009/03/02/169096.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/169096.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/169096.aspx</trackback:ping><description>&lt;p&gt;今日はまったバグ。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#000000"&gt;Map&amp;lt;Long,&amp;nbsp;String&amp;gt;&amp;nbsp;map&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;HashMap&amp;lt;Long,&amp;nbsp;String&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;map.put&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#990000"&gt;1L&lt;/font&gt;&lt;font color="#000000"&gt;,&amp;nbsp;&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;1&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;System.out.println&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;map.get&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#990000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;System.out.println&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;map.get&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#990000"&gt;1L&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;キーに1 (ボクシング変換でIntegerになる)を渡した場合と1Lを渡した場合で挙動が異なるというオチ。Map.get()の引数がObjectなので両方受け付けちゃうんですね。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/169096.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>再帰型のジェネリクス型変数の境界</title><link>http://blogs.wankuma.com/nagise/archive/2009/01/23/166722.aspx</link><pubDate>Fri, 23 Jan 2009 23:45:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2009/01/23/166722.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/166722.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2009/01/23/166722.aspx#Feedback</comments><slash:comments>614</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/166722.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/166722.aspx</trackback:ping><description>&lt;p&gt;先日ジェネリクスで引っ掛かった点をメモ。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/05/25/139308.aspx"&gt;自己言及するジェネリクス&lt;/a&gt;で述べたような具象型に具象型自身の型を扱わせることをもくろんだ型を作った場合の話。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;GenericsTest&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;static&amp;nbsp;abstract&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;S&amp;lt;T&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;S&amp;lt;T&amp;gt;&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;static&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;A&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;S&amp;lt;A&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;static&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;B&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;A&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;static&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;C&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;S&amp;lt;A&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;static&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;X1&amp;lt;T&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;S&amp;lt;T&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;{}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;static&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;X2&amp;lt;T&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;S&amp;lt;?&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;{}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;static&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;X3&amp;lt;T&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;S&amp;lt;?&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;super&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;T&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;{}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;static&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;void&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;main&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt;[]&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;args&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;X1&amp;lt;A&amp;gt;&amp;nbsp;x1A;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;OK&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;X1&amp;lt;B&amp;gt;&amp;nbsp;x1B;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;NG&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;X1&amp;lt;C&amp;gt;&amp;nbsp;x1C;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;NG&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;X2&amp;lt;A&amp;gt;&amp;nbsp;x2A;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;OK&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;X2&amp;lt;B&amp;gt;&amp;nbsp;x2B;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;OK&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;X2&amp;lt;C&amp;gt;&amp;nbsp;x2C;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;OK&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;X3&amp;lt;A&amp;gt;&amp;nbsp;x3A;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;OK&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;X3&amp;lt;B&amp;gt;&amp;nbsp;x3B;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;OK&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;X3&amp;lt;C&amp;gt;&amp;nbsp;x3C;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;NG&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sが親となるクラスで&amp;lt;T extends S&amp;lt;T&amp;gt;&amp;gt;という境界をもつジェネリクス型変数Tを持ちます。
サブクラスであるAはこのTにA自身を渡すことで、Sクラス中にT型で宣言した部分をA型にすることができるのですね。&lt;/p&gt;

&lt;p&gt;そのA型を継承したクラスBを考えた場合、BはS&amp;lt;A&amp;gt;を継承しているのでB extends S&amp;lt;A&amp;gt;ということになります。
なのでX1の境界&amp;lt;T extends S&amp;lt;T&amp;gt;&amp;gt;に合致しません。&lt;/p&gt;

&lt;p&gt;こうした型を受け入れれるように規制を緩めたのがX2で&amp;lt;T extends S&amp;lt;?&amp;gt;&amp;gt;としています。
この場合、穴ができてCのようなAのサブクラスでもないのにSの型変数TにAを渡したような歪なクラスを宣言した場合に許容されてしまいます(x2C部分)。
クラスS中に表現されるTを具象型自身にするという趣旨からすればこのような歪な型は許容したくありません。
T型の戻り値のメソッドでreturn this;とか書きたいわけです。&lt;/p&gt;

&lt;p&gt;なので正確に型を表現するとしたならば&amp;lt;T extends S&amp;lt;? super T&amp;gt;&amp;gt;とします。
これでAはもちろん、AのサブクラスであるBも許容され、歪なCは弾くことができます。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/166722.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>次世代のカプセル化手法</title><link>http://blogs.wankuma.com/nagise/archive/2009/01/07/165863.aspx</link><pubDate>Wed, 07 Jan 2009 21:48:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2009/01/07/165863.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/165863.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2009/01/07/165863.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/165863.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/165863.aspx</trackback:ping><description>&lt;p&gt;「interfaceに物申す」
(&lt;a href="http://blogs.wankuma.com/episteme/archive/2009/01/06/165674.aspx"&gt;1&lt;/a&gt;)
(&lt;a href="http://blogs.wankuma.com/episteme/archive/2009/01/06/165690.aspx"&gt;2&lt;/a&gt;)
(&lt;a href="http://blogs.wankuma.com/episteme/archive/2009/01/07/165775.aspx"&gt;3&lt;/a&gt;)
は、public, protected, privateといったアクセス制御の修飾子によるカプセル化の限界を憂いたものです。&lt;/p&gt;

&lt;p&gt;そもそもこれらの修飾子はクラスを境界としたカプセル化であるため、デザインパターンなどクラス群で表現されるモジュールの
内外の境界でのカプセル化には無力です。
Javaではパッケージプライベートというアクセス制御レベルも存在しますが、モジュール境界とパッケージ境界を一致させることが
現実的ではないことはご周知のとおりです。
こうしたクラス群で表現されるモジュールに対して、カプセル化を行うための新たな機能が求められているわけです。&lt;/p&gt;

&lt;p&gt;そこでスーパーパッケージ(superpackage)という概念が提唱されました。
これはJSR 294として仕様の策定が行われており、Java7で搭載される見込みです。
(&lt;a href="http://www.infoq.com/news/2009/01/java7-updated"&gt;http://www.infoq.com/news/2009/01/java7-updated&lt;/a&gt;参照)&lt;/p&gt;

&lt;p&gt;スーパーパッケージについては
&lt;a href="http://journal.mycom.co.jp/articles/2007/05/13/superpackage/"&gt;http://journal.mycom.co.jp/articles/2007/05/13/superpackage/&lt;/a&gt;
が比較的詳しいかと思います。&lt;/p&gt;




&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/165863.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>ジェネリクスの代入互換の補足</title><link>http://blogs.wankuma.com/nagise/archive/2009/01/04/165571.aspx</link><pubDate>Sun, 04 Jan 2009 18:06:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2009/01/04/165571.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/165571.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2009/01/04/165571.aspx#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/165571.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/165571.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/08/20/153557.aspx"&gt;ジェネリクスの代入を理解する その２&lt;/a&gt;に以下の質問を頂きました。&lt;/p&gt;

&lt;p&gt;&lt;blockquote&gt;
インタフェースIFをAが実装しているとし、&lt;br&gt;
A←B←Cの関係はそのままの場合で下記処理をコンパイルしたとします。&lt;br&gt;
List&amp;lt;? super B&amp;gt; list = new ArrayList&amp;lt;IF&amp;gt;&lt;br&gt;
list.add(new B()); //1&lt;br&gt;
list.add(new A()); //2&lt;br&gt;
list.add(new C()); //3&lt;br&gt;
&lt;br&gt;
この場合も2はエラーとなってしまいます。 &lt;br&gt;
ArrayList&amp;lt;IF&amp;gt;にAをaddしても矛盾しないと思うのですが、&lt;br&gt;
これは何故なのでしょうか？？ 
&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;変数list はList&amp;lt;? super B&amp;gt;型ですから、ArrayList&amp;lt;B&amp;gt;型を代入することができますよね。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
List&amp;lt;? super B&amp;gt; list = new ArrayList&amp;lt;IF&amp;gt;();&lt;br&gt;
list = new ArrayList&amp;lt;B&amp;gt;();&lt;br&gt;
list.add(new A());&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;としたらどうなるでしょうか？&lt;br&gt;
ArrayList&amp;lt;B&amp;gt;にAをaddすることになりますね。落ち着いて考えてみてください。List&amp;lt;? super B&amp;gt; list = new ArrayList&amp;lt;A&amp;gt;();のケースと同じです。&lt;/p&gt;

&lt;p&gt;コンパイルによる静的な型チェックは、いつ変数listにどういう型を代入されたかを追跡しません。&lt;br&gt;
なので代入して矛盾が発生する可能性がある場合にすべてコンパイルエラーとします。&lt;/p&gt;

&lt;p&gt;古いエントリになりますが、&lt;a href="http://blogs.wankuma.com/nagise/archive/2007/08/04/88855.aspx"&gt;ジェネリクスと代入と落とし穴2&lt;/a&gt;も併せてご覧ください。&lt;/p&gt;

&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/165571.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>わんくま同盟 富山勉強会レポート</title><link>http://blogs.wankuma.com/nagise/archive/2008/11/12/161028.aspx</link><pubDate>Wed, 12 Nov 2008 01:10:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/11/12/161028.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/161028.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/11/12/161028.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/161028.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/161028.aspx</trackback:ping><description>&lt;p&gt;11/8(土)にわんくま同盟 富山勉強会が開催されました。&lt;/p&gt;

&lt;p&gt;参加いただいた皆様、スピーカーを引き受けてくださった皆様、ネットから視聴していただいた皆様、どうもありがとうございました。&lt;/p&gt;

&lt;h4&gt;Wicketで変わるウェブ・アプリケーション開発&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/t_yano/"&gt;矢野勉&lt;/a&gt;氏のWicketのセッション。私が忘れ物をしたせいで、セッション時間を入れ替えてもらったという経緯あり。そんなわけで、自分はほとんど見ることができなかったのが悔やまれます。&lt;/p&gt;

&lt;h4&gt;RIAことはじめ&lt;/h4&gt;

&lt;p&gt;3月まで自分一緒にプロジェクトをやっていたhikaru氏に頼んでFlexの紹介セッションをやってもらいました。
初スピーカーで緊張気味でしたが、セッション狙い（「Flexで作ったアプリは簡単なのにリッチだ!!」といった部分を伝える）は達成できたんじゃないかな。&lt;/p&gt;

&lt;h4&gt;おひるごはん&lt;/h4&gt;

&lt;p&gt;私を含む8人で県民会館から少々歩いたところにあるうどん屋（本当は蕎麦屋なんだけど、最近蕎麦を出していない）「鶴喜」にて。富山の名店。平日と土曜の昼しか開いていないのでなかなか食べに行けない。&lt;/p&gt;

&lt;h4&gt;Javaのこれまでとこれから&lt;/h4&gt;

&lt;p&gt;本当は最初にやるはずだったセッション。この日の勉強会の各種セッションの土台となる部分を統括的に。Javaの歴史のおさらいと、最近の方向性を提示して、各セッションで具体的なところを見てもらうというつもりだったのですが。&lt;/p&gt;

&lt;p&gt;最近は、システム開発の環境改善には経済的側面をちゃんと考えないとうまくいかないよというのを痛感しているので、そちらの比重が高めにしてみました。&lt;/p&gt;

&lt;h4&gt;部屋移動&lt;/h4&gt;

&lt;p&gt;会場の都合で連続して部屋を確保できなかったので部屋移動が入ってしまいました。後半の部屋の方が椅子とか座り心地が良かった。富山県民会館を使うなら7Fの部屋の方がグレードが高いよ！&lt;/p&gt;

&lt;h4&gt;ライトニングトーク&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/katzchang/"&gt;katzchang氏&lt;/a&gt;による&lt;a href="http://ja.wikipedia.org/wiki/Io_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)"&gt;プログラミング言語Io&lt;/a&gt;の話。言語としてなかなか面白そう。&lt;/p&gt;

&lt;p&gt;daisuke氏によるメールサーバの管理の話。スパムのリレーが多くて挙句スパムのブラックリストに載せられてしまった！スパム対策どうしよう！といった話題。スパム対策は本当に頭の痛い問題です。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/t_yano/"&gt;矢野勉&lt;/a&gt;氏が飛び入りで１つやってくれました。業務で使うちょっとしたツールもJavaで書いちゃうぜってときに短く楽に書くためのコツみたいな話。潔い割り切りが重要。時間が余って晒し者タイムになったのでjava-jaでのLTの雰囲気とかそんな話も少々。&lt;/p&gt;

&lt;h4&gt;JavaからScalaへ&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://cappuccino.jp/keisuken/logbook/"&gt;keisuken氏&lt;/a&gt;のScalaセッション。と見せかけて本題は氏の開発する&lt;a href="http://webflavor.sourceforge.net/index_ja.html"&gt;Web Flavor&lt;/a&gt;だったりしたセッション。手続き型のプログラム言語しかやったことない人にはかなりのデカルチャーだったのではないでしょうか。自分もチャンスがあったらScalaを採用したいなぁ。&lt;/p&gt;

&lt;h4&gt;やっぱAppletやちゃ&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/yone098/20081109/1226201544"&gt;米林正明氏&lt;/a&gt;によるセッション。Java SE6 update10のドラッガブルアプレットとかそのあたりの話題。(&lt;a href="http://www3.atword.jp/jacksparrow/2008/10/09/java-se6-update10-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-applet-%E3%81%A7%E9%81%8A%E3%81%B6%EF%BC%81/"&gt;参考：Java SE6 update10 を使って Applet で遊ぶ！&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;これはデモのインパクトが大。会場が沸きました。JavaScript - Applet間での呼出しは実務でも応用が効きそうですね。注目すべき技術の一つでしょう。&lt;/p&gt;

&lt;p&gt;なお、タイトルの語尾「～やちゃ」は「～だよ」の富山弁表現。氏は富山の出身だそうで、今回の勉強会もスケジュールの厳しい中駆けつけてくれました。感謝！&lt;/p&gt;

&lt;h4&gt;懇親会&lt;/h4&gt;

&lt;p&gt;近くのお店に移動して懇親会。掘りごたつ型の座敷だったんだけど、席移動がしにくいのが難点かな。各所で話が盛り上がっていたのはいいのだけど、話す人が偏ってしまいましたね。&lt;/p&gt;

&lt;h4&gt;1.5次会&lt;/h4&gt;

&lt;p&gt;数名はラーメンの富山ブラックの大喜（富山駅前店）に吸い込まれていきました。県外の人は一度食べておくと話のネタになるかもしれない。個人的には、一度だけでいいんじゃないのとも思う。&lt;/p&gt;

&lt;h4&gt;2次会&lt;/h4&gt;

&lt;p&gt;白馬館という老舗バー。富山駅前の近くなので、電車やバスなどの人がいる場合には最適。自分は思い切り面が割れているので悪いことはできません。えぇ。&lt;/p&gt;

&lt;h4&gt;3次会&lt;/h4&gt;

&lt;p&gt;代行運転を捕まえて凪瀬邸へ。矢野氏は前日からの疲れからか付いた早々に爆睡。もうひとりのメンバーkeisuken氏としばらく話をして就寝。&lt;/p&gt;

&lt;h4&gt;翌日&lt;/h4&gt;

&lt;p&gt;朝に二人を送って富山駅へ。お土産を購入。富山の黒作り（イカスミ入りのイカの塩辛）を勧める。関西方面のkeisuken氏を見送った後、東京方面の電車の発射まで時間があったので矢野氏と朝食。話し込んでいたら時間ぎりぎりになってしまった。無事に乗れたようでなにより。&lt;/p&gt;

&lt;h4&gt;月曜日&lt;/h4&gt;

&lt;p&gt;気が緩んだのか風邪をひいたらしく、寒気がしてヤバい。夕方に早退して実家で養生。レポートが遅れてすいません。&lt;/p&gt;

&lt;h4&gt;関連記事&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/t_yano/20081109/1226260475"&gt;わんくま同盟 富山勉強会に参加してきました&lt;/a&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/yone098/20081109/1226201544"&gt;わんくま富山勉強会#01で発表してきました&lt;/a&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/katzchang/20081109/p1"&gt;わんくま富山勉強会&lt;/a&gt;
&lt;li&gt;&lt;a href="http://cappuccino.jp/keisuken/logbook/20081111.html#p02"&gt;わんくま同盟 富山勉強会 #01 まとめ&lt;/a&gt;
&lt;/ul&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/161028.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>今週末は富山勉強会#1</title><link>http://blogs.wankuma.com/nagise/archive/2008/11/06/160554.aspx</link><pubDate>Thu, 06 Nov 2008 01:29:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/11/06/160554.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/160554.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/11/06/160554.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/160554.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/160554.aspx</trackback:ping><description>&lt;p&gt;いよいよ今週末土曜日が&lt;a href="http://www.wankuma.com/seminar/20081108toyama01/Default.aspx"&gt;わんくま同盟 富山勉強会 #01&lt;/a&gt;です。&lt;/p&gt;

&lt;p&gt;場所は富山県民会館です。当日参加も可能ですが、出来るだけ事前登録をお願いします。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10:40 ～ 10:50 わんくまについて&lt;/li&gt;
&lt;li&gt;10:50 ～ 11:40 「Javaのこれまでとこれから」&lt;a href="http://blogs.wankuma.com/nagise/"&gt;凪瀬 悠輝&lt;/a&gt;Lv2くまー&lt;/li&gt;
&lt;li&gt;11:50 ～ 12:20 「RIAことはじめ - Flex-Javaで簡単なアプリを作成してみる -」hikaru&lt;/li&gt;
&lt;li&gt;12:20 ～ 13:20 おひるごはん♪&lt;/li&gt;
&lt;li&gt;13:20 ～ 14:20 Wicket関連&lt;a href="http://d.hatena.ne.jp/t_yano/"&gt;矢野 勉&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;14:20 ～ 14:50 部屋移動&lt;/li&gt;

&lt;li&gt;14:50 ～ 15:20 ライトニングトーク&lt;/li&gt;
&lt;ul&gt;
	&lt;li&gt;katzchang&lt;/li&gt;
	&lt;li&gt;daisuke&lt;/li&gt;
	&lt;li&gt;スピーカー募集中！&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;15:20 ～ 16:10 「JavaからScalaへ、ScalaからJavaへ(仮)」&lt;a href="http://cappuccino.jp/keisuken/logbook/"&gt;keisuken&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;16:20 ～ 17:10 Teeda、Applet関連&lt;a href="http://d.hatena.ne.jp/yone098/"&gt;米林正明&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;17:40 ～         懇親会&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;わんくま勉強会全般がそうですが、&lt;b&gt;懇親会がメイン&lt;/b&gt;です！&lt;/p&gt;
&lt;p&gt;いろんな人といろんな話ができるのはこうした勉強会の大きなメリットですね。
懇親会に参加される方はお店の予約の関係もあるので、できるだけ早く登録をお願いします。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/160554.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>