一千萬個為什麽

搜索

接口常量有什麽用?

我正在學習Java,只是發現接口可以有公共靜態和最終的字段。到目前為止,我還沒有看到這些例子。這些接口常量的一些用例有哪些,我可以在Java標準庫中看到一些嗎?

最佳答案

將靜態成員放入接口(並實現該接口)是一種不好的做法,甚至還有一個名稱,常量接口反模式,請參閱 Effective Java ,第17項:

常量接口模式是接口使用不佳。一個類在內部使用一些常量是一個實現細節。實現常量接口會導致此實現細節泄漏到類的導出API中。類的用戶實現一個常量接口並不重要。事實上,它甚至可能使他們感到困惑。更糟糕的是,它代表了一種承諾:如果在將來的版本中修改了類以便它不再需要使用常量,它仍然必須實現接口以確保二進制兼容性。如果非最終類實現了一個常量接口,那麽它的所有子類的命名空間都會受到接口中常量的汙染。

     

java平臺庫中有幾個常量接口,例如 java.io.ObjectStreamConstants 。這些接口應該被視為異常和   不應該被模仿。

為了避免常量接口的一些缺陷(因為你不能阻止人們實現它),應該首選一個帶私有構造函數的正確類(例如借用維基百科):

public final class Constants {

    private Constants() {
       //restrict instantiation
    }

    public static final double PI = 3.14159;
    public static final double PLANCK_CONSTANT = 6.62606896e-34;
}

要訪問常量而不必完全限定它們(即不必使用類名稱作為前綴),請使用靜態導入(自Java 5起):

import static Constants.PLANCK_CONSTANT;
import static Constants.PI;

public class Calculations {

    public double getReducedPlanckConstant() {
        return PLANCK_CONSTANT/(2 * PI);
    }
}

轉載註明原文: 接口常量有什麽用?