網頁

2020/5/9

Effective Java 3e - Item 22: Use interfaces only to define types 筆記

Effective Java 3e - Item 22: Use interfaces only to define types 介面應該只用來定義型態 筆記。

介面(Interface)作為定義其實作類別(Class)的所屬型態,除此之外不應在介面中定義常數。

僅定義常數且無定義方法的介面又稱constant interface(常數介面)。類別透過繼承constant interface來直接使用這些常數。然而constant interface是糟糕的用法。

例如下面的PensionConstants就是一個constant interface。

PensionConstants

 // Constant interface antipattern - do not use!
public interface PensionConstants {

    static final double SIMPLE_MULTIPLIER  = 1.5;

    static final double COMPLEX_MULTIPLIER = 1.4958;

    static final int RETIREMENT_AGE = 65;
}


constant interface的問題是,這些常數是用作子類的內部實作細節,而定義在interface中意味著這些細節可曝露了。當使用者使用了繼承constant interface的子類別時就會看到這些的常數並感到困惑。

另個問題在於介面意味著永久承諾,其所有子類無論未來是否需要都必須持續支持這些定義在介面中的常數且無法修改命名。

常數應該定義在與其有緊密關係的類別,或定義在工具類(utility class)。

例如下面把原本定義在constant interface的常數改定義在工具類PensionConstants中。

PensionConstants

public class PensionConstants {

    private PensionConstants() { // 避免實例化
        throw new AssertionError(); 
    }

    static final double SIMPLE_MULTIPLIER  = 1.5;
    static final double COMPLEX_MULTIPLIER = 1.4958;
    static final int RETIREMENT_AGE = 65;
}

沒有留言:

張貼留言