1. 程式人生 > >Java中常量定義在interface和class的區別(轉)

Java中常量定義在interface和class的區別(轉)

var tac 不能被繼承 ble -o err 模式 variable 個人愛好

最終結論:定義常量在interface和class中其實都行,關鍵是看你的設計和個人愛好。

Java中interface中定義變量默認都是"public static final"類型的,也就是常量,因此很多人在interface定義常用的常量。

下面是功能等同的兩種定義常量的方式:

class:

package com.example;

public final class Constants {
    private Constants() {}
    public static final int A = 100;
    public static final 
int B = 100; public static final int C = 100; public static final int D = 100; }

interface:

package com.example;

public interface Constants {
    int A = 100;
    int B = 100;
    int C = 100;
    int D = 100;
} 

類定義常量和接口定義常量:

1、類定義常量,需要定義成final且定義一個private的構造方法,這樣做是為了不讓其他類繼承,禁止實例化此類,調用時直接以"類.常量"的方式調用。

2、接口中定義的"變量",其實就是常量,接口中的"變量"默認都是 "public static final"類型,即為常量,因此接口可以省略"public static final"而直接寫成 "type variable"。

3、用如上的類定義常量,不能實例化也不能被繼承,看起來完美無缺。

4、接口定義常量,雖不能實例化,確可以被其他類實現;

因此有這麽一種設計模式"The constant interface pattern". 所謂的"常量接口模式", 就是其他類要使用接口中定義的常量,就實現該接口. 我認為這是對接口的爛用. 接口中定義的常量應為所有類頻繁使用的常量,但並不是每個類都使用了接口中定義的所有常量,因而導入了不必要的常量到這個類中,並且導入後這個類的子類也會基礎導入的常量,這樣會導致混亂,應當避免此種用法。

5、在interface和class中定義相同的常量,interface生成的class文件比class生成的class文件會更小,而且更簡潔,效率更高。可以使用jad和javap反編譯去分析一下。

個人總結:

1、不要使用"常量接口模式",此模式會導致類中的常量混亂,增加維護難度。註意!是常量接口模式時不要使用,而對於普通的設計是可以使用接口去實現的。

2、不要使用靜態導入,import static *****,因為import static會導致可維護性下降,維護的人看代碼時,不是那麽清楚或者不那麽迅速的知道這個常量位於哪個文件中。建議使用常量的地方直接 "接口.常量名" 的方式使用。

3、還有用這種方式定義常量: public abstract class Constants {},很容易看出這種方式定義常量的目的:禁止實例化。但是"abstract class"的目的是為了讓其他類繼承,因此語意別扭,同樣具有interface定義常量的確定,即可以被繼承, 其實解決上述問題更優美的方式是用final修飾類並給類定義一個private構造方法。

4、對於用是用interface定義常量還是使用class定義常量,看個人喜好. 個人覺得interface定義常量更為優美:代碼更簡潔, 生成的class文件更小,JVM不要考慮類的附加特性,如方法重載等,因而更為高效。這是一種反模式的用法,很多人不喜歡這種用法,如果我們知道它的優缺點,延長避短,也是無可厚非的,還有一點是不要把這種用法用成"常量接口模式",個人覺得"常量接口模式"確實是一種對interface的"pool use"。

參考:

http://blog.csdn.net/voo00oov/article/details/50433672(以上內容轉自此篇文章)

http://my.oschina.net/gschen/blog/134794?fromerr=zKrZIUb5

http://stackoverflow.com/questions/2659593/what-is-the-use-of-interface-constants

http://www.ibm.com/developerworks/cn/java/l-java-interface/index.html

http://blog.csdn.net/pan_junbiao/article/details/5906745

Java中常量定義在interface和class的區別(轉)