Javaで気になること

オートボクシング

Java 5.0からの機能であるオートボクシング・オートアンボクシングは、便利といえば便利なのでしょうが、私は全く使ったことがないかもしれません。

簡単に言えば、プリミティブとオブジェクト型を暗黙のうちに変換してくれる機能であり、Integerとintの相互変換などということになります。

List<Integer> list = new ArrayList<Integer>();
for(int i = 0; i < 10; i++){
   list.add(i);
}
int sum = 0;
for(Integer i: list){
   sum += i;
}

上記のコードは、Integerとintを同一視して扱っていますが、特に問題ありません。明示的に変換される形でコンパイルされるのでしょうけれど、何となく落ち着きません。大体、下のfor文で、iにnullが入ったときには例外が投げられるはずです。
やはり、きちんと書かせるのがよいのではないかと思ってしまいます。

shadowing

メソッドをサブクラスでオーバーライドするのは当然ですが、同一名の変数をサブクラスで定義するのは気に入りません。

class A{
   int x = 10;
   int getX(){
      return x;
   }
}
class B extends A{
   int x = 20;
   int getX(){
      return x;
   }
   int getSuperX(){
      return super.getX();
   }
}

例えば、(私の記憶が確かなら)上記コードでクラスBのインスタンスに対して、getX()は20、getSuperX()は10、フィールドアクセスではクラスBインスタンスがB型なら20、A型なら10であったかと思います。

サブクラスでスーパークラスの変数をshadowingするのは、コードがわかりにくくなる上、メリットは少ないのではないかと思っています。これはできないように廃止か警告して欲しい。変数がprivateやデフォルトスコープ(かつ別パッケージで継承する)の時など、外部に出ない場合は別に構わないと思います。