Re:UML Distilled Third Edition

UMLにおけるValue Objectの表現について言及しています。Value Objectはprimitiveなデータです。DateのようなものがValue Objectの典型ですが、JavaのDateはprimitive型ではなくて、拡張可能な普通のクラスです。では、Reference ObjectとValue Objectの違いは何かというとそれはIidentityをどれだけ重要視するかということです。

Value objects may have an identity, but don't use if for equality.
(P.74, Reference Objects and Value Objectsより)

ここの記述は、(明示されていませんが)昨今のValue ObjectとData Transfer Objectの用語の混乱が背景にあると思います。Value ObjectはReference Objectとの対比で説明するとわかりやすいですね。

jboss-fan: 2回目以降のdeployでClassCastExceptionが発生します

最近、クラスローダネタが続いています。

クラスローダはソースコード上では目に見えないので実行時エラーが発生したときに原因が非常にわかりづらいです。一般的に、Javaのプログラミングのトラブルの多くはクラスパスに起因することが多いですが、クラスローダはこのクラスパスの問題をさらに複雑にします。

クラスローダの問題を解決するにはクラスのローディングパスを目に見える形にする必要があります。org.jboss.test.util.Debugはクラスの親クラスローダを順番にたどって、URLのリストを表示してくれます。でも、これだけでは不十分ですし、ログを出力するためにソースを変更しなければなりません。

クラスローダのログを取るのにAspectJを使えないか以前から考えています。narrowのときにClassCastExceptionが発生するとわかっているなら、AspectJを使ってnarrowの引数オブジェクトに対して上記Debugクラスを実行できるでしょう。あるいは、ClassCastExceptionをAspectJでキャッチしてエラーの発生したスタックを調べることもできそうです。上手くツールとしてまとめられないかな。

JVMに燃えよドラゴン

Java仮想マシン入門Returnsを読んだら、なんでもjavap -verboseしたくなってきました。AspectJのコードも逆アセンブルできるようになるぞ! と、この勢いでProgramming for the Java Virtual Machineを注文。