Effective Java(項目25〜26)

週明けの割りにテンションが低いのは昨日風邪を引いてしまい病み上がりだから。
○項目25 メソッドのシグニチャを注意深く設計する

  • メソッド名を注意深く選ぶ。名前は常に標準命名規約に従うべき。

  • 便利なメソッドを提供し過ぎたりしないようにする。個々のメソッドは「自分の役割」を果たすべき。

→これは言われてみればそうだけど忘れがちかも知れない

  • 長いパラメータのリストは避ける
    • 通常3個程度を実用的な最大値とみなすべき(でも今はIDEが協力だからなぁ・・・)
    • 同じ型のパラメータが何個も続くのは特に有害(これは同感)

→どうしてもパラメータが長くなってしまうなら、メソッドの分割を検討する

  • パラメータ型に関しては、クラスよりインタフェースを選ぶ

→例えばHashtableと書くぐらいならMapと書く

○項目26 オーバーロードを注意して使用する

→知らなかった、感覚的に間違っていた

//不完全 - オーバーロードの謝った使用! ←また誤った!!
public class CollectionClassifier {
  public static String classify(Set s) {
    return "Set";
  }
  
  public static String classify(List l) {
    return "List";
  }
  
  public static String classify(Collection c) {
    return "Unknown Collection";
  }
  
  public static void main(String[] args) {
    Collection[] tests = new Collection[] {
      new HashSet(),         //Set
      new ArrayList(),       //List
      new HashMap().values() //SetあるいはListのどちらでもない
    }
    
    for (int i = 0; i < tests.length; i++) {
      System.out.println(classify(tests[i]));    
    }
  }
}

↑この結果は"Unknown Collection"を3回表示、となる。
→これはtests[i]はコンパイル時にひとまずCollection型となるため。実行時の型はオーバーロードの選択に依存しない!!
※ちなみにオーバーライドの場合は実行時に選択(これは感覚的に合っていた)

  • オーバーロードされたメソッドの選択は静的、オーバーライドされたメソッドの選択は動的

→この違いは多くのプログラマにとって感覚的ではない、困惑するのではないか

  • プログラマを困惑させない方法を考える
    • 同じパラメータ数のオーバーロードされたメソッドを提供しないことにする
    • 同じパラメータ数ではあるが、それらのうちの少なくとも1つがそれぞれ互いに型変換不可能である場合は大丈夫