Effective Java 3 rdエントリ22は、タイプのみを定義する場合にインタフェースを使用する

2573 ワード

クラスがインタフェースを実装する場合、このインタフェースはクラスのインスタンスを参照するために使用できるタイプの役割を果たします.クラスはインタフェースを実装しているので、このクラスのインスタンスを使用して、クラスが何ができるかを説明する必要があります.他の目的のためにインタフェースを定義するのは適切ではありません.この検出に合致しないインタフェースの1つは、いわゆる定数インタフェース(constant interface)である.このようなインタフェースには、いかなる方法も含まれていない.静的finalドメインのみが含まれ、各ドメインに定数がエクスポートされます.これらの定数のクラスを用いてこのインタフェースを実現することで,クラス名で定数名を限定する必要が回避される.次の例を示します.
//         -     ! 
public interface PhysicalConstants {
    //         (1/mol)
    static final double AVOGADROS_NUMBER = 6.022_140_857e23;

    //        (J/K) 
    static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;

    //      (kg) 
    static final double ELECTRON_MASS = 9.109_383_56e-31;
}

定数インタフェースモードはインタフェースの悪い使用です.1つのクラスの内部でいくつかの定数を使用することは、実装の詳細です.定数インタフェースを実装することによって、この実装の詳細がこのクラスの導出APIに漏れる.クラスは定数インタフェースを実現し,このクラスのユーザにとって重要ではない.実際には、彼らを困惑させる可能性があります.さらに悪いことに、これは、今後のパブリケーションでこのクラスが変更され、これらの定数を使用する必要がなくなった場合、両方の互換性を保証するために、このインタフェースを実装する必要があるという約束を表しています.非finalクラスが定数インタフェースを実現すると、彼のすべてのサブクラスは、そのネーミング空間をこのインタフェースの定数によって汚染します.
Javaプラットフォームライブラリにはjavaなどの定数インタフェースがたくさんあります.io.ObjectStreamConstants.これらのインタフェースは異常と見なすべきで,模倣すべきではない.
定数を導出したい場合は、合理的な選択肢がたくさんあります.定数が既存のクラスまたはインタフェースと密接に関連している場合は、このクラスまたはインタフェースに追加する必要があります.たとえば、IntegerやDoubleなどのすべての数値の元の梱包クラスは、MIN_をエクスポートします.VALUEとMAX_VALUE定数.定数が列挙タイプのメンバーと見なすことが望ましい場合は、enumタイプ(enum type)としてエクスポートする必要があります(エントリ34).そうでなければ、インスタンス化できないユーティリティクラス(エントリ4)を使用して定数をエクスポートする必要があります.以下は、以前に説明したPhysicalConstantsの例の有効クラスバージョンです.
//       
package com.effectivejava.science;
public class PhysicalConstants { 
    private PhysicalConstants() { }//      
、
    public static final double AVOGADROS_NUMBER = 6.022_140_857e23; 
    public static final double BOLTZMANN_CONST = 1.380_648_52e-23; 
    public static final double ELECTRON_MASS = 9.109_383_56e-31;

}

ちなみに、数値字面量の下線文字()を使用します.下線はJava 7以来合法的であり、数値字面量の値には影響しませんが、慎重に使用すれば読みやすくなります.浮動小数点数に5つ以上の連続数が含まれている場合は、決定されているかどうかにかかわらず、数値字面量に下線を追加することを考慮します.少なくとも10個のフォント値の場合、整数または浮動小数点数にかかわらず、下線を使用してフォント値を3つの数のグループに分割する必要があります.これは、正または負の1000乗を表します.
通常、ユーティリティクラスは、クライアントがクラス名を使用して定数名を限定する必要がある.例えば、PhysicalConstants.AVOGADROS_NUMBER.有効クラスから導出された定数を大量に使用する場合は、静的インポート(static import)機能を使用することで、クラス名限定定数の使用を回避する必要があります.
//              
import static com.effectivejava.science.PhysicalConstants.*;
public class Test { 
    double atoms(double mols) { 
        return AVOGADROS_NUMBER * mols; 
    } 
    ...
    // PhysicalConstants               
}

要するに、インタフェースはタイプを定義するときにのみ使用されるべきです.定数のみをエクスポートする場合に使用するべきではありません.