java

try節はthrow-catchを伴わなくてもよい。

int method(){ assert this.checkPreCondition(); try{ return 1; } finally { assert this.checkPostCondition(); } } try節の評価が終了した段階で必ずfinally節を評価する、という仕様になっている。つまり、try節内でreturnやbreakを利用した場合、try節…

Lambda+Aspect

http://d.hatena.ne.jp/kilrey/20040309#p1のFunctorを使えばLambda式を作り出すことが出来る。さらにAspect手法を使えば各classにFunctorのMapを追加することが出来る。つまり、動的オブジェクトが得られる。*1 *1:利点は特にない。型付けが弱くoverloadが…

javassist続き

javassistで作ったクラスは通常のクラスと機能面で同等である。しかし、動的に生成しているのだから当然なのだが、静的な文脈で利用する、即ち型情報を利用することが出来ない。つまり、意図せずとも実装の隠蔽がなされるわけである。

javassistを使ってみた。

JBossで既存のクラスをアスペクト指向的に変換するために使われている動的クラス生成ライブラリらしい。*1せっかくなので、スクラッチからクラスを動的に生成してみた。 *1:J2EEは触ったことがない。

Generics & template(C++)

javaのGenericsとc++のtemplateは似ている。*1 しかし、両者の設計思想は大きく異なっている。なぜならばGenericsは型をパラメータに取るのに対して、templateはクラスをパラメータに取る。つまり、Genericsは複合的な型情報を扱うための技術であり、templat…

Globalな変数

Globalな変数はどこからでも参照できるため、不変性が破壊される原因になりがちである。この問題を回避するにはGlobalな変数自体を不変オブジェクト化しておけばよい。さて、javaのGlobalな変数とはclass staticな変数のことなのだろうか、それともclass自体…

N次不変オブジェクト

即値・nullは*次不変である。 不変でないオブジェクトは0次不変である。 N次不変オブジェクトの持つフィールドがそれぞれ次不変オブジェクトだとしたとき、が成り立つ。

オブジェクトの不変性

即値は不変である。 フィールド全てにfinal修飾が付いたクラスのインスタンスは不変である。

変数の不変性

final修飾の付いた変数は不変である。

オブジェクトの局所性

オブジェクトの局所性についても定義しておく。 def 即値は局所的である。 def 局所的なフィールドしか持たないオブジェクトは局所的である。 ただし、不変オブジェクトは局所的であると見なしてよい。

オブジェクトの副作用

def 主作用は副作用ではない。 def 局所オブジェクトの操作は副作用ではない。*1 def 非局所オブジェクトの操作のうち、更新を伴わないものは副作用ではない。 def 以上に該当しない作用はすべて副作用である。 要点:主作用だけが非局所的であればよい。最…

即値の副作用

def 即値の参照は副作用を持たない。 def 即値の代入の返り値は副作用である。

Object#equals()の作法

Object#equals()はオブジェクト間の等価性を定義するためのメソッドである。そのため、不適切な定義を行えば、java.util.collectionなど、様々なフレームワークが破綻する。そのため、あらゆるフレームワークに対応するような定義について考える。 Object#eq…

変数の不変・オブジェクトの不変

Imutable.java public class Imutable { final public String str; public Imutable(String str){ super(); this.str = str; } public void main(String[] args){ Imutable im = new Imutable("Object1"); im = new Imutable("Object2"); } } 上のImutable.s…

委譲・継承

Inheritance.java public class Inheritance extends SuperClass implements Interface { public void method(){ super.doSomething(); } } Delegation.java public class Inheritance implements Interface { SuperClass superClass; public void method(){…

Wrap.java public class Wrap { public Object obj; public Object getObj(){ return this.obj; } public void setObj(Object obj){ this.obj = obj; } } このWrap.javaにおいてはgetObjとobjへの参照、setObjとobjへの代入が等価である。Fieldへの直接参照…

eclipse+CVSNT

ローカルでのソース管理にCVSを導入した。 最初はオーバーテクノロジーかと思っていたが、サーバにはCVSNT、クライアントにはeclipseという組み合わせなら導入コストを気にするほどのものではなかった。

Map#get(K)とList#get(int)。

便利そうなのにエラーが出るのね。 MapList.java public interface MapList extends SortedMap, List{ V get(int index);//List由来 V get(K key);//Map由来 } 追記:エラーの原因はMap#remove(Object)とCollection#remove(Object)の返値の不整合だった。こ…

型と意味

型は実装を含まない。そのため、多重継承とは異なり多重型は安全である。 ただし、同名かつ同引数メソッドを持つinterfaceを二つimplementsすると名前空間の衝突が起きる。そのため、返値の型が異なる場合にはコンパイル時にエラーが発生する。 さて、返り値…

続き

型とinterfaceの区別が必要かもしれない。 interfaceは型情報を持つ classも型情報を持つ 変数定義の際に型付けを行う 昨日http://d.hatena.ne.jp/kilrey/20040330のは一つの変数(仮引数だが)に「複数の型の積集合」という型を付けていた。genericsの本来の…

疑問

引数があるinterfaceを実装していることを強要するだけのために、genericsを使えるのだろうか? 例えば、Cloneableのようなタグが複数付いていることを保障する*1ことの需要はあると思う。だからといって組合せごとに新しいinterfaceを作るのは気持ち悪いし…

欲しいものリスト

immutable 言語レベルでオブジェクトのimmutable性を保障して欲しい。変数・フィールドはfinal修飾子でimmutable化できるが、メソッドをimmutable化する仕組みも欲しい。 generic配列 配列とListとの違いをなるべく小さくして欲しい。Object[] implements Li…

続・思いつき

extendsを指定してあるのでstaticメソッドの存在は確定しているはずだが、それでもGeneric型からstaticメソッドを呼ぶことは出来なかった。*1Genericsが扱うのはTypeであって、Classではないということなのだろう。 public class Test { static public void …

思いつき

java1.5のGenericsではGeneric型のConstructorが使えない。静的解決では実行時の型名に強く依存する処理が扱えないためであり、同様にGeneric型のstaticメソッドも扱うことが出来ない。 つまり、動的に決まる部分はReflectionを使うべきだ、という方針の表れ…

疑問

メソッドコール単位でGenericsの型付けが出来た方が使いやすいのではないか。クラスの場合と全く同じ手順で消去できる*1し、特にデメリットが思いつかない。 追記:実際に出来た。マニュアルはちゃんと読もう。 public class Test{ static public List makeL…

続・関数オブジェクト

必ずしもConsを使う必要は無かったらしい。 Functor.java public interface Functor { Result evaluate(Argument arg); } としておいて、 FunctorA.java public class FunctorA >, Result > { Result evaluate(Argument arg){ return null; } } というように…

関数オブジェクト

昨日のConsを使って関数オブジェクトを作ってみた。static methodみたいなものなのだけど、集合やリストに渡して各要素を計算させたり、……。 引数の型チェックを書かないでよいので、Consの型表記が面倒でも使い道はあるかもしれない。動作速度については Co…

Cons

GenericsなConsをLinkListのように使う*1ことで任意個のGenerics型を指定できる。ただし、Generics型指定がとても面倒になってしまうし、Consを大量に作らなければならないし、……と特に利点はない。 Cons.java public class Cons { final public Car car; fi…

FactoryMethod

Creator.java public interface Creator { Product factoryMethod(); } これでCreator-Product間の連携は明確になる。ただ、一つのCreatorが複数のProductを作る必要がある場合*1には使えないので、やや問題があるような。 *1:実際多い。