Java が使いにくいのは静的だからではない

Java が使いにくい言語であるというのは、世界中の LL ファンが皆思っていることだろうから改めていうことでもないけど、使いにくいのは静的言語だからというのは間違っている。Java が使いにくいのは単に Java の設計者のセンスが悪かっただけであり、静的言語のせいではない。

たとえばこんなコード。

public Map<String, List<String>> example() {
  List<String> list = new ArrayList<String>();
  list.add("foo");
  list.add("bar");
  list.add("baz");
  Map<String, List<String>> map = new HashMap<String, List<String>>();
  map.put("names", list);
  return map;
}


まあなんといいますか。Map や List を表すリテラルがないせいで、記述が冗長になってしかたない。どうせ List と Map の 99 パーセントは ArrayList と HashMap なんだから、もうそろそろリテラルを用意してもいいと思う。型指定のせいでリテラルが難しいのであれば、「new ArrayList {"foo", "bar", "baz"};」のような記述を用意するだけでもずいぶん違う。

追記(2008-03-07):「リテラル」という言葉に過剰に反応している人もいるが、ここでの趣旨は「本質的ではない記述を減らして Java を使いやすくする」ということなので、ライブラリで済むのであればそれで結構 (コメントを参照のこと)。また『リテラルを用意してもいいと思う』『リテラル難しいのであれば』と書いたように、絶対にリテラルを導入すべきだという主張ではない。あくまで、Java を使いやすくするための方法のひとつとして提案したまでであり、他の方法を否定してはいない。趣旨を勘違いしないでいただきたい。)


また > が 1 行に 2 回出てくるのがうっとうしい。List#add() や List#put() は戻り値が void だが、これは return this とするべき (StringBuffer#append() はそうなっているのにね)。せめてこう書けるようにしてほしかった。

public Map<String, List<String>> example() {
  var list = new ArrayList<String>();
  list.add("foo").add("bar").add("baz");
  var map = new HashMap<String, List<String>>();
  map.put("names", list);
  return map;
}


「var」という予約語が増やしているから互換性が問題になるけど、assert と同じでコンパイルオプションで on/off すればいいだろう。

あと、アクセッサね。いちいち getter と setter を定義しなきゃいけないのがバカバカしい。よく「IDE で自動生成すれば問題ない」という人がいるけど、そんなのが必要な時点で間違ってるとは思わないのだろうか。だいたい、本質的でないコードが何十行もある時点で、ソースコードの readability が下がってしまう。あんなもの、コード行数を水増しするための仕様だ。

世の Java 屋はこのコードを見ても、何も疑問に感じないそうだ。ありえん。

private int id;
private String name;
private Date updated;

public int getId() {
  return this.id;
}
public void setId(int id) {
  this.id = id;
}
public String getName() {
  return this.name;
}
public void setName(String name) {
  this.name = name;
}
public Date getUpdated() {
  return this.date;
}
public void setUpdate(Date date) {
  this.date = date;
}


これが次のように簡単になったら、なにか問題でもあるのだろうか。こっちのほうが書くのも簡単だし、なにより本質的でないコードがなくなるためたいへん読みやすい。

@accessor private int id;
@accessor private String name;
@accessor private Date updated;


こういった Java の使いにくさは、静的言語であることとは関係がない。Java の言語設計者は、仕様をコンパクトにすることには注意を払っていたけど (それも 1.5 で覆ったが)、使いやすさについてはあまり関心がなかったようだ。というか、Java に限らず Struts とか EJB とか見る限り、SUN や IBM には使いやすさに関するセンスがない。使いやすい product はほとんどが個人で作った OSS だ。