Java

リフレクションでのEnum継承クラスのコンストラクタ

enumキーワードで宣言されるEnum継承クラス(ここではE)のコンストラクタは、リフレクションで調べると… package test; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class EnumConstructorTest { pri…

共変戻り値型に使えるワイルドカード

clone()の戻り値型は、共変戻り値型 (covariant return type) が使えることを利用して、定義されたクラスの型にするのがよいとされている。参考: http://www.ne.jp/asahi/hishidama/home/tech/java/clone.html#h2_covariantでは、コピーをリストで複数返した…

void配列はありません

Javaでよく遊んでいるのでメモ。 void.classが取れるならvoid[].classも取れるのでは?と思ったが取れなかった。 リフレクションでもvoid配列は作れなかった。 package test; import java.lang.reflect.Array; public class VoidArrayTest { public static v…

投げるよ投げるんだよ投げちゃうからね

(1/8微妙に追記) メソッドのthrowsに同じ例外を複数書いていいと知った。 これでもかとExceptionを投げると宣言することができる。 これで共同開発者に例外への思い入れを伝えよう!

インデックス付きforeachループ

(1/8改良版を末尾に追加) 問題 foreachループでインデックスが使いたい。(今何番目?) かといって下のようにローカル変数iを使うとiがループの後で見えてしまうのが嫌。 参考:foreachでインデックスが使いたい場合はそれなりにある http://blog.livedoor.jp/…

MapがIterableではない理由(憶測)

疑問 JavaのMapはキーと値のペアの集まりであるとみなせる。 コレクション(集まり)は通常便利のためIterableを実装している。 (実際にはサブインターフェースのCollectionを実装していることが多い) しかしMapインターフェースはIterableを継承していない。 …

続・名前のない再帰関数

前回のエントリー http://d.hatena.ne.jp/kya-zinc/20091205/1259999256 を考え直した。 要するに無名関数からthis(自分自身の参照)が見えればよいので applyの引数として渡してやる。 呼び出しにはもう一つの無名関数f => f(f)を使ってやる。 object Anonym…

Exception tableがついちゃってました

バイトコードを見てみよう 前回のエントリー id:kya-zinc:20091204 でコンパイラにバグがあったことを知った。 何が違ったのかな、と思い、Javapコマンドでバイトコードを見てみた。 問題の関数のみ抜粋。バグあり版 public void finally_rec(int); Code: 0:…

例外隠蔽に使える?finally中return

概要 前のエントリーでScalaのreturnで遊んだ http://d.hatena.ne.jp/kya-zinc/20090901 とき、Javaの挙動が気になったので、finallyについて調べてみた。 Scala同様、finally中でreturnまたはthrowすると、 tryの中のreturnやthrowを打ち消すことができると…

イテレータで竹藪を焼く

メニュー 今日は、Javaのイテレータで竹藪を焼いてみます。 動機 Iterableの挙動を変えたい。 拡張forはシンタックスが分かりやすいので、もっと使われてもいいと思う。 元ネタ うろ覚えだがScalaの教科書、Programming in Scala http://www.amazon.co.jp/Pr…

Javaでリスト生成遅延

動機 必要なだけ要素が作られる無限リストを生成したい。 元ネタ Haskellを使う人に有名なフィボナッチ数列の生成方法がある。 fib = 0:1:zipWith (+) fib (tail fib)これで無限に続くフィボナッチ数列ができる。 Haskellのよいところは、遅延評価(lazy eval…

継承による再帰のトレース

継承を使うと、元のメソッドを変えずに、メソッドの再帰呼び出しの引数および戻り値を見ることができることに気づいた。

エレガントなテンプレートを求む

アルバイト先の企画で、Javaのペアプログラミングを実践した。 数人とペアプログラミングをし、各々のEclipse使いっぷりをアピールしあったのだが テンプレート機能について知らない人が多かったので、共有したいという願いをこめてメモしておく。 テンプレ…

Iterableで範囲for

Javaで、Iterableを実装すると拡張forが書けることを知ったので 範囲に関するイテレーションのためのクラスRangeを書いてみた。 Rubyほど簡単にはならないが、少し書きやすくなることがわかる。 参考:RubyのRangeクラス http://www.ruby-lang.org/ja/man/htm…

無意味なスタックトレースの伸ばし方

JavaのThrowableがもつスタックトレースはThrowableオブジェクトがnewされたときに、 VMのスタックを見に行きトレースを埋めるという仕様になっているらしい。 Throwableのコンストラクタでは、nativeメソッドThrowable.fillInStackTraceが必ず呼ばれている…

例外から例外

(2009/4/26シンタックスハイライト追加) Javaで例外の原因を例外それ自身にすると実行時例外が発生することを知った。 Throwable.initCauseでできる。 例外の種類は…Throwableのソースを見ればすぐわかる。 package hoge; public class ThrowableExp { publi…