試し

JavaのStandard Editionの5を入れたので、新しい文法を試してみることにした。やってみないとわからないからね。

Static Import

Javaでプログラムを書いていて、アプリ全体に共通の定数を一つのインタフェース内で宣言して、いろいろなところでimportすることがある。また、共通的なstaticなメソッドを一つのクラスに集めて宣言したりする。
前者はSwingだと、SwingConstantsとか、WindowConstantsなんかが、そういうことをしている。後者はjava.lang.Mathとか、java.util.Collectionsなんかね。インタフェースは、implementsしちゃえばいいんだけど、クラスだとextendsするのはオブジェクトとしての意味が変わってきちゃうからやるべきじゃないし、他のクラスがextendsされていると、そもそもできない。
classをimportして、staticメソッドを呼び出す場合、

Collections.max(...);

なんて書かないといけないから、毎回、"Collections."ってつけるのが面倒くさいよね、と。Staice Importってのは、これを書かなくてもいいようにするための文法変更。

これを使うには、

これを使うには、

import static java.util.Collections.*;

なんて書けばよくて、そうすると、importしたクラスやインタフェースのstaticなフィールドやメソッドが、自分の中で宣言されているように呼び出すことが出来るようになる。
これでついに、staticという限定はついても、フィールドやメソッド単位での扱いが出来るようになったということだ。これって、オブジェクト指向の言語なのかね。というか、「全てがオブジェクト」っていう、Javaの言語仕様の矛盾が吹き出した、ってことなのかもしれないけど。

その他、

新しい言語仕様を試すために、簡単なプログラムを書いてみた。全然、注釈とか入れてないんだけどさ。Static Importは、インタフェースに使ったから、無理してる。言語仕様の変更は、賛成できるもの、出来ないもの、両方あるなぁ。

import java.util.Vector;

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;

import static javax.swing.WindowConstants.*;

/**
 * @author kobayashitk
 *
 */
public class test {

	public static void main(String[] args) {
		test t = new test();
	}

	public test() {
		JFrame frame = new JFrame( "Hello World" );
		frame.setDefaultCloseOperation( DISPOSE_ON_CLOSE );

		Vector v = new Vector();
		v.add( 101 );
		v.add( 201 );
		v.add( 301 );

		DefaultListModel model = new DefaultListModel();
		for( int i: v ) {
			model.addElement( i );
		}
		
		JList list = new JList( model );
		frame.getContentPane().add( list );
		frame.setBounds( 100, 100, 200, 100 );
		frame.setVisible( true );
	}
}

拡張forループやAutoBoxing/Unboxingなんかもそうだけど、見た目上は、すごく読みやすくなった。おまじない、と説明しないといけなかった部分は、減ってきた。ただ、ちゃんと理解した上で使わないと思わぬ副作用が出そう。現に、Static Importは、あんまり使わないように、と書いてるしね。
これで、Javaは、書く人のレベルによって、プログラムに違いの出る言語になったということだ。文法を簡単にするのと引き換えに、Javaの設計思想のいい部分が置きざりにされたような感じね。うーん。