effective java :17条interfaces 只應當被用來定義型別 (types)

博客介绍了Java中interface用于定义class的Signature,成为一种型别指向class实体。指出constant interface是不良运用,会导致实现细节泄露和命名空间污染。建议将与class或interface紧密关联的常量加入其中,或用typesafe enum class、不可被实体化的utility class导出常量,interface应仅用于定义型别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般來說,interfaces 是用來定義 class 的 Signature 的
當某個 class 實作了某個 interface,則該 interface 就變成了一種型別
可以用來指向這個 class 的實體

有一種interface,用來定義constant type
這種 interface 稱之為 constant interface
public interface PEOPLE_Constant {
static final String MAN = "MALE";
static final String WOMAN = "FEMALE";
}

而 constant interface 其實是一種不良的 interface 運用
因為 「class 內部使用某些常數只是一種實作細節」
實現 constant interface 會導致實作細節洩漏至 class 的 exported API 中
如果一個 final class 實現了一個 constant interface,其所有的 subclasses 會因為 interface 中的常數而造成命名空間污染(namespaces pollution)

常數若與既有的 class 或 interface 有緊密的關連,則應該將他們加入到那個 class 或 interface 中
這與 Refactoring 倒有些關連性
例如 Java 標準程式庫中的 Integer.MIX_VALUE 與 Integer.MAX_VALUE,都是類似的作法
而若該常數適合作為列舉型(enumerated type)成員,那你就應該以一個 typesafe enum class(條款21) 來匯出他們
否則應該以一個「不可被實體化」的 utility class(條款3) 加以匯出
public class PEOPLE_Constant {
prviate PEOPLE_Constant () {} // 不可被實體化

public static final String MAN = "MALE";
public static final String WOMAN = "FEMALE";
}


總而言之,interface 應該只用來定義型別(types),而不應該用來匯出(export)常數.....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值