第19條-接口只用于定義類型

當(dāng)類實(shí)現(xiàn)接口時(shí)笑跛,接口就充當(dāng)可以引用這個(gè)類的實(shí)例的類型(type)亿卤。因此類實(shí)現(xiàn)了接口驱敲,就表明客戶端可以對(duì)這個(gè)類的實(shí)例實(shí)施某些動(dòng)作。為了其他目的而定義接口是不恰當(dāng)?shù)摹?/p>

常量接口

有一種接口被稱為常量接口(constant interface)赐俗,他不滿足上面的條件拉队。這種接口沒有包含任何方法,他只包含靜態(tài)的final域阻逮,每個(gè)域都到處一個(gè)常量粱快。使用這些常量的類實(shí)現(xiàn)這個(gè)接口,以避免用類名來修飾常量名叔扼。

public interface PhysicalConstants {
    //阿伏伽德羅數(shù)
    static final double AVOGADROS_NUMBER = 6.02214199e23;

    //玻爾茲曼常數(shù)
    static final double BOLRZMANN_CONSTANT = 1.3806503E-23;

    //電子質(zhì)量
    static final double ELECTRON_MASS = 9.10938188E-31;
}
public class test implements PhysicalConstants {
     public static void main(String[] args) {
         Double d = 11.11;
         if(d.equals(AVOGADROS_NUMBER)){
             System.out.println(d);
         }
    }
}

阿伏伽德羅數(shù)事哭,其具體的數(shù)值是6.0221367×1023,這個(gè)常數(shù)可用很多種不同的實(shí)驗(yàn)方法進(jìn)行測(cè)定瓜富。
12.000克C中所含碳原子的數(shù)目,因意大利化學(xué)家A.阿伏伽德羅而得名鳍咱,具體的數(shù)值是6.0221367×10。包含阿伏伽德羅數(shù)個(gè)微粒的物質(zhì)的量是 1摩爾与柑。例如1摩爾鐵原子谤辜,質(zhì)量為 55.847 克,其中含 6.0221367×10個(gè)鐵原子仅胞;1摩爾水分子的質(zhì)量為18.010克,其中含6.0221367×10個(gè)水分子;1摩爾鈉離子含6.0221367×10個(gè)鈉離子;1摩爾電子含6.0221367×10個(gè)電子剑辫。

** 常量接口模式是對(duì)接口的不良使用干旧。** 類在內(nèi)部使用某些常量,這純粹是實(shí)現(xiàn)細(xì)節(jié)妹蔽。實(shí)現(xiàn)常量接口椎眯,會(huì)導(dǎo)致把這樣的實(shí)現(xiàn)細(xì)節(jié)泄露到該類的導(dǎo)出API中。類實(shí)現(xiàn)常量接口胳岂,這對(duì)于用戶來講并沒有什么價(jià)值编整。實(shí)際上,這樣做反而會(huì)使他們更加糊涂乳丰。更糟糕的是掌测,他代表了一種承諾:如果將來的發(fā)行版本中,這個(gè)類被修改了产园,他不再需要使用這些常量了汞斧,他依然必須實(shí)現(xiàn)這個(gè)接口,以確保二進(jìn)制兼容性什燕。如果非final類實(shí)現(xiàn)了常亮接口粘勒,他的所有子類的命名空間也會(huì)被接口中的常量所“污染”。

在java平臺(tái)類庫中有幾個(gè)常量接口屎即,例如java.io.ObjectStreamConstants庙睡。這些接口應(yīng)該被認(rèn)為是反面的典型事富,不值得被效仿。

package java.io;

/**
 * Constants written into the Object Serialization Stream.
 *
 * @author  unascribed
 * @since JDK 1.1
 */
public interface ObjectStreamConstants {

    /**
     * Magic number that is written to the stream header.
     */
    final static short STREAM_MAGIC = (short)0xaced;

    /**
     * Version number that is written to the stream header.
     */
    final static short STREAM_VERSION = 5;

    /* Each item in the stream is preceded by a tag
     */

    /**
     * First tag value.
     */
    final static byte TC_BASE = 0x70;
public class ObjectInputStream
    extends InputStream implements ObjectInput, ObjectStreamConstants
{
    /** handle value representing null */
    private static final int NULL_HANDLE = -1;

    /** marker for unshared objects in internal handle table */
    private static final Object unsharedMarker = new Object();

    /** table mapping primitive type names to corresponding class objects */
    private static final HashMap<String, Class<?>> primClasses
        = new HashMap<>(8, 1.0F);

(省略若干行)

    /**
     * The readStreamHeader method is provided to allow subclasses to read and
     * verify their own stream headers. It reads and verifies the magic number
     * and version number.
     *
     * @throws  IOException if there are I/O errors while reading from the
     *          underlying <code>InputStream</code>
     * @throws  StreamCorruptedException if control information in the stream
     *          is inconsistent
     */
    protected void readStreamHeader()
        throws IOException, StreamCorruptedException
    {
        short s0 = bin.readShort();
        short s1 = bin.readShort();
        if (s0 != STREAM_MAGIC || s1 != STREAM_VERSION) {
            throw new StreamCorruptedException(
                String.format("invalid stream header: %04X%04X", s0, s1));
        }
    }

如果要導(dǎo)出常量乘陪,可以有幾種合理的選擇方案统台。

  • 如果這些常量與某個(gè)現(xiàn)有的類或者接口緊密相關(guān),就應(yīng)該把這些常量添加到這個(gè)類或者接口中暂刘。例如饺谬,在java平臺(tái)類庫中所有的數(shù)值包裝類,比如Integer和Double谣拣,都導(dǎo)出了MIN_VALUE和MAX_VALUE常量募寨。
public final class Integer extends Number implements Comparable<Integer> {
    /**
     * A constant holding the minimum value an <code>int</code> can
     * have, -2<sup>31</sup>.
     */
    public static final int   MIN_VALUE = 0x80000000;

    /**
     * A constant holding the maximum value an <code>int</code> can
     * have, 2<sup>31</sup>-1.
     */
    public static final int   MAX_VALUE = 0x7fffffff;
  • 如果這些常量最好被看做枚舉類型的成員,就應(yīng)該用枚舉類型(enum type)(見30條)來導(dǎo)出這些常量森缠。
  • 使用不可實(shí)例化的工具類(utility class)(見4條)來導(dǎo)出這些常量
public class PhysicalConstants {

    private PhysicalConstants(){}
    //阿伏伽德羅數(shù)
    public static final double AVOGADROS_NUMBER = 6.02214199e23;

    //玻爾茲曼常數(shù)
    public static final double BOLRZMANN_CONSTANT = 1.3806503E-23;

    //電子質(zhì)量
    public static final double ELECTRON_MASS = 9.10938188E-31;
}

工具類通常要求客戶端要用類名來修飾這些常量名拔鹰,例如PhysicalConstants.AVOGADROS_NUMBER。如果大量利用工具類導(dǎo)出的常量贵涵,可以通過利用靜態(tài)導(dǎo)入(static import)機(jī)制列肢。避免用類名來修飾常量名,不過靜態(tài)導(dǎo)入機(jī)制是在java發(fā)行版本1.5中才引入的:

package example;
import static example.PhysicalConstants.*;
/**
 * Created by Jiang Meiwei on 2017/5/7.
 */
public class test {
    double atoms(double mols){
        return AVOGADROS_NUMBER * mols;
    }
}

總結(jié):

簡(jiǎn)而言之宾茂,接口應(yīng)該只被用來定義類型瓷马,他不應(yīng)該被用來導(dǎo)出常量。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跨晴,一起剝皮案震驚了整個(gè)濱河市欧聘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌端盆,老刑警劉巖怀骤,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異焕妙,居然都是意外死亡蒋伦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門焚鹊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痕届,“玉大人,你說我怎么就攤上這事末患∫ィ” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵阻塑,是天一觀的道長(zhǎng)蓝撇。 經(jīng)常有香客問我,道長(zhǎng)陈莽,這世上最難降的妖魔是什么渤昌? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任虽抄,我火速辦了婚禮,結(jié)果婚禮上独柑,老公的妹妹穿的比我還像新娘迈窟。我一直安慰自己,他們只是感情好忌栅,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布车酣。 她就那樣靜靜地躺著,像睡著了一般索绪。 火紅的嫁衣襯著肌膚如雪湖员。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天瑞驱,我揣著相機(jī)與錄音娘摔,去河邊找鬼。 笑死唤反,一個(gè)胖子當(dāng)著我的面吹牛凳寺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播彤侍,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼肠缨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了盏阶?” 一聲冷哼從身側(cè)響起晒奕,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎般哼,沒想到半個(gè)月后吴汪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惠窄,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒸眠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杆融。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楞卡。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖脾歇,靈堂內(nèi)的尸體忽然破棺而出蒋腮,到底是詐尸還是另有隱情,我是刑警寧澤藕各,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布池摧,位于F島的核電站,受9級(jí)特大地震影響激况,放射性物質(zhì)發(fā)生泄漏作彤。R本人自食惡果不足惜膘魄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望竭讳。 院中可真熱鬧创葡,春花似錦、人聲如沸绢慢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胰舆。三九已至骚露,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間思瘟,已是汗流浹背荸百。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滨攻,地道東北人够话。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像光绕,于是被迫代替她去往敵國(guó)和親女嘲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 當(dāng)類實(shí)現(xiàn)接口時(shí)诞帐,接口就充當(dāng)可以引用這個(gè)類的實(shí)例的類型欣尼。因此,類實(shí)現(xiàn)了接口停蕉,就表明客戶端對(duì)這個(gè)類的實(shí)例可以實(shí)施某些動(dòng)...
    真愛也枉然閱讀 332評(píng)論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法愕鼓,類相關(guān)的語法,內(nèi)部類的語法慧起,繼承相關(guān)的語法菇晃,異常的語法,線程的語...
    子非魚_t_閱讀 31,660評(píng)論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理蚓挤,服務(wù)發(fā)現(xiàn)磺送,斷路器,智...
    卡卡羅2017閱讀 134,695評(píng)論 18 139
  • 枚舉類型是指由一組固定的常量組成合法值的類型灿意,例如一年中的季節(jié)估灿,太陽系中的行星或者一副牌中的花色。在編程語言...
    小小輝_710a閱讀 1,440評(píng)論 0 0
  • 五都里是個(gè)美麗的古老小村莊缤剧,這里風(fēng)景宜人馅袁,四季分明,民風(fēng)淳樸荒辕,祖輩以種地務(wù)農(nóng)為生汗销。近幾十年來隨著工業(yè)化的發(fā)展芒粹,很多...
    littlecool閱讀 961評(píng)論 0 0