簡體   English   中英

JAVA接口中實例變量的公共靜態最終聲明

[英]Public static final declaration of an instance variables in JAVA Interfaces

為什么我們在Java接口中使用實例變量的public static final聲明?
所有變量都是Java接口中的隱式public static final
在常量變量中使用public static final是一種很好的編碼實踐,盡管它是在Interface中聲明的。

例如 :

public interface TestInterface{

public static final String EX_CONSTANT = "ABC";
public static final int EX_INT_CONSTANT = 5;
public static final double EX_DOUBLE = 5.0;
public static final Integer EX_INTEGER = 10;

}

在類和接口中使用統一語法簡化了重構。

您可能希望將來將interface轉換為某個class ,或者將這些字段移動到一個類中,如果忽略一些沒有public static final定義的字段,您將獲得語義差異(當然,我們有重構工具,但盡管如此)。

我認為與支持@Overriden注釋以支持在Java 6中引入的接口中聲明的方法的實現相同 - 它在當前形式中是多余的,但在重構的情況下可能會變得有用。

我不這么認為。 所有接口變量都是隱式公共靜態final,所以沒有意義將它們標記為相同。

來自JOshua Bloch的Effective java一書

第19項:僅使用接口來定義類型

當類實現接口時,接口充當可用於引用類實例的類型。 因此,類實現接口應該說明客戶端可以對類的實例做什么。 為任何其他目的定義接口是不合適的。

一種未通過此測試的接口是所謂的常量接口。 這樣的接口不包含任何方法; 它僅由靜態最終字段組成,每個字段都輸出一個常量。 使用這些常量的類實現接口,以避免使用類名限定常量名稱。 這是一個例子:

// Constant interface antipattern - do not use!
public interface PhysicalConstants {
    // Avogadro's number (1/mol)
    static final double AVOGADROS_NUMBER = 6.02214199e23;
    // Boltzmann constant (J/K)
    static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
    // Mass of the electron (kg)
    static final double ELECTRON_MASS = 9.10938188e-31;
}

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

Java平台庫中有幾個常量接口,例如java.io.ObjectStreamConstants。 這些接口應視為異常,不應模擬。

如果要導出常量,有幾個合理的選擇。 如果常量與現有類或接口緊密相關,則應將它們添加到類或接口。 例如,所有帶框的數字基本類(如Integer和Double)都會導出MIN_VALUE和MAX_VALUE常量。 如果常量最好被視為枚舉類型的成員,則應使用枚舉類型(第30項)導出它們。 否則,您應該使用不可實例化的實用程序類導出常量(第4項)。 這是上面的PhysicalConstants示例的實用程序類版本:

// Constant utility class
package com.effectivejava.science;

public class PhysicalConstants {
    private PhysicalConstants() {
    } // Prevents instantiation

    public static final double AVOGADROS_NUMBER = 6.02214199e23;
    public static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
    public static final double ELECTRON_MASS = 9.10938188e-31;
}

通常,實用程序類要求客戶端使用類名限定常量名稱,例如PhysicalConstants.AVOGADROS_NUMBER。 如果大量使用實用程序類導出的常量,則可以通過使用1.5版中引入的靜態導入工具來避免使用類名限定常量:

// Use of static import to avoid qualifying constants
import static com.effectivejava.science.PhysicalConstants.*;
public class Test {
    double atoms(double mols) {
        return AVOGADROS_NUMBER * mols;
    }
...
// Many more uses of PhysicalConstants justify static import
}

總之,接口應僅用於定義類型。 它們不應該用於導出常量。

IMO,Interface是一份合同。 一旦聲明或定義了變量,它們就不會改變。 這就是為什么我們通常會將它們作為public static final

可讀性是使聲明冗余的另一個因素。

不可否認,這是多余的。 通常人們只是不知道他們是隱含的public static final並且無論如何都要宣告它。 同上,例如聲明:

public abstract interface Test { // Interfaces are always abstract
    public void testMethod(); // Interface methods are always public
    abstract void anotherTestMethod(); // Also redundant
}

通常它只是歸結為一個事實,即人們不知道,他們沒有宣布它的一種方式或其他。 我曾經和某個人(他是一個經驗豐富的程序員)交談,認為switchdefault情況是必需的,否則它將無法編譯。

話雖如此,添加它們的唯一理由是它們澄清了它們的實際可見性和實際情況。 這是一個可讀性和澄清的問題,是否包含它們或注意它們在實際行為方面是無關緊要的。

當你在一個程序員團隊中工作時,你會發現初級程序員不知道默認情況下變量是接口中的public static final ,並且看到以這種方式聲明的變量將為他們提供有關接口的額外信息。使用其變量。

你是對的:這是多余的。 我不喜歡隨時添加冗余語法。 然而,這種做法確實有其信徒。 有些人還喜歡在返回表達式周圍添加括號,這是因為它有點像'if'語句; 額外的括號,以“澄清”三年級學生會理解的算術表達式; 它是生活豐富多彩的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM