讀古今文學網 > 編寫高質量代碼:改善Java程序的151個建議 > 第3章 類、對象及方法 >

第3章 類、對象及方法

書讀得多而不思考,你會覺得自己知道的很多。

書讀得多而思考,你會覺得自己不懂的越來越多。

——伏爾泰

在面向對像編程(Object-Oriented Programming, OOP)的世界裡,類和對象是真實世界的描述工具,方法是行為和動作的展示形式,封裝、繼承、多態則是其多姿多彩的主要實現方式,如此,OOP才會像現在這樣繁榮昌盛、欣欣向榮。

本章主要講述關於Java類、對像、方法的種種規則、限制及建議,讓讀者在面向對像編程的世界中走得更遠,飛得更高。

建議31:在接口中不要存在實現代碼

看到這樣的標題讀者可能會納悶:接口中有實現代碼?這怎麼可能呢?確實,接口中可以聲明常量,聲明抽像方法,也可以繼承父接口,但就是不能有具體實現,因為接口是一種契約(Contract),是一種框架性協議,這表明它的實現類都是同一種類型,或者是具備相似特徵的一個集合體。對於一般程序,接口確實沒有任何實現,但是在那些特殊的程序中就例外了,閱讀如下代碼:


public class Client{

public static void main(Stringargs){

//調用接口的實現

B.s.doSomething();

}

}

//在接口中存在實現代碼

interface B{

public static fnal S s=new S(){

public void doSomething(){

System.out.println("我在接口中實現了");

}

};

}

//被實現的接口

interface S{

public void doSomething();

}


仔細看main方法,注意那個B接口。它調用了接口常量,在沒有任何顯式實現類的情況下,它竟然打印出了結果,那B接口中的s常量(接口是S)是在什麼地方被實現的呢?答案是在B接口中。

在B接口中聲明了一個靜態常量s,其值是一個匿名內部類(Anonymous Inner Class)的實例對象,就是該匿名內部類(當然,可以不用匿名,直接在接口中實現內部類也是允許的)實現了S接口。你看,在接口中存在著實現代碼吧!

這確實很好,很強大,但是在一般的項目中,此類代碼是嚴禁出現的,原因很簡單:這是一種不好的編碼習慣,接口是用來幹什麼的?接口是一個契約,不僅僅約束著實現者,同時也是一個保證,保證提供的服務(常量、方法)是穩定、可靠的,如果把實現代碼寫到接口中,那接口就綁定了可能變化的因素,這就會導致實現不再穩定和可靠,是隨時都可能被拋棄、被更改、被重構的。所以,接口中雖然可以有實現,但應避免使用。

注意 接口中不能存在實現代碼。