« LOOX U にWindows7を入れたら使い物になるだろうか | トップページ | VAIO type Pのバッテリー(S)だけが… »

2009/01/15

Java/swing と C#/.NET のイベント処理の違いがね

まぁ、どっちが良いという話をするつもりはない。ただ、Java が 1.0 の時に採用したものの調子が悪くてやめたイベント処理モデルを .NET Framework が使っているというのは面白いと個人的に思っただけだ。

結局、イベントが伝搬していくという Java 1.0 とか .NET Framework のイベントモデルは、途中にバカなイベント処理プログラムがいると動作自体が崩壊してしまう。ま、バカなというのは言い過ぎだが、どこかにバグが潜んでいると、イベント処理が全部まとめて止まってしまい非常に調子が悪い。

だからだと思うのだが、Java 1.1 以降では、イベントのリスナーすべてに同時にイベントを送る(マルチスレッド使用)というモデルになった。ま、古いイベント処理も書けるけどそれは推奨されないので変わったと言ってしまって良いだろう。

んで、どっちが良いのかは正直わからない。.NET のイベントを順番に処理していくモデルは、一つのイベントを複数のイベント処理プログラムが奪い合うということがないので、結果としてプログラム的にはシンプルになる。だがしかし、処理が直列になることによる弊害があることもまた事実だ。

Java のイベントモデルは、イベントに対して登録してあるリスナーすべてにスレッド分岐して同時にイベント処理が開始する。だから、誰かにイベントが奪われてしまうということがない。しかし、登録されているリスナーがすべて同時に動き出してしまうので、処理を直列化したいケース(たとえば、誰もイベントを処理しなかったら動くルーチンとか)が書きにくい。

この辺は宗教論争に近いものがあるし、正直、どっちの方法も正解なんだと思う。要はそういう特徴を持ったライブラリであると言うことを意識してプログラムすればよい。

…と、自分の心に刻み込みたいと思います。不具合なんか嫌いだ。

でも、個人的には、Java 流の、リスナーを定義する方法が好き。まぁ、マルチスレッドの処理が書きやすいJavaだからこそ出来た芸当なんだと思うが。.NET は、GUI周りのライブラリがスレッドセーフではないので、こういうイベントモデルの採用がそもそも出来なかったんだろう。invoke あたりに、非常に苦労の跡が見える。

ま、他にも、言語を作った会社の思想が色濃く出ていますねー。Java/swing も C#/.NET も。

言語的には、Java の方が綺麗。C#は泥臭い。でも、Java は洗練されているが故に、どうしても遠回りして書かないといけないケースが多いが(経験則)、C#は、とりあえず書きたい処理があれば大抵ストレートに書ける。その代わり、C#の言語仕様は全然洗練されていない。だから、泥臭いイメージがどうしても消えない。

個人的には、Java/swing がもうちょっと成功していてくれたら、世の中平和だったんじゃないかなーと思っています。もはや、それは望んでも叶わない夢なのですが。

PS.勘違いで嘘書いているかも。Java はともかく、.NET はあまり深く触っていないので勘違いしている可能性も捨てがたい。

|

« LOOX U にWindows7を入れたら使い物になるだろうか | トップページ | VAIO type Pのバッテリー(S)だけが… »

コメント

>>Java 1.1 以降では、イベントのリスナーすべてに同時にイベントを送る(マルチスレッド使用)というモデルになった。
これは、間違いだと思います。
Javaは、シングルスレッドモデルなので一本のスレッド(EDT)上で順番にリスナーを呼び出しています。
(だからどこかのリスナーが無限ループをかますと固まります。)

投稿: katsu | 2009/02/03 00:50

むむ?私が勉強した本には、イベントのマルチキャストのモデルでは、すべてのリスナーに対してイベントをブロードキャストするとか(文章うろ覚え)書いてあったので、マルチスレッドで動くもんだとてっきり思っていたが。

ま、疑問に思ったらすぐ実験。

-- こんな source を即興で書いてみた --
package jp.ne.sonet.da2.tokada;

import javax.swing.*;
import java.awt.event.*;

public class sample {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
JFrame frame = new JFrame();
JButton button = new JButton();
frame.add(button);
button.setLabel("OK");
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try {
System.out.println("step-1");
java.lang.Thread.sleep(1000);
System.out.println("step-2");
java.lang.Thread.sleep(1000);
System.out.println("step-3");
java.lang.Thread.sleep(1000);
System.out.println("step-4");
java.lang.Thread.sleep(1000);
System.out.println("step-5");
}
catch (Exception err){
// 何もしない
}
}
});
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try {
System.out.println("step-6");
java.lang.Thread.sleep(1000);
System.out.println("step-7");
java.lang.Thread.sleep(1000);
System.out.println("step-8");
java.lang.Thread.sleep(1000);
System.out.println("step-9");
java.lang.Thread.sleep(1000);
System.out.println("step-10");
}
catch (Exception err){
// 何もしない
}
}
});
frame.show();

}
}

---- 結果 ----
step-6
step-7
step-8
step-9
step-10
step-1
step-2
step-3
step-4
step-5

シングルスレッドでした。うーん、やっぱり知識はちゃんと検証しないといけませんな。
一つ勉強になりました。

投稿: おかだ | 2009/02/03 21:16

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/50935/43752382

この記事へのトラックバック一覧です: Java/swing と C#/.NET のイベント処理の違いがね:

« LOOX U にWindows7を入れたら使い物になるだろうか | トップページ | VAIO type Pのバッテリー(S)だけが… »