在 Java OOP 编程中的注意事项
在 Java OOP 編程中的注意事項(xiàng)
- 重寫
- 方法
- 字段
- 反射
- static
- 接口
- abstract
- Maven
- JUnit
重寫
方法
當(dāng)子類重寫超類的方法時,子類該方法的被訪問權(quán)限不能低于超類方法。如果超類方法為 public,則子類被重寫的方法也要為 public。即子類重寫方法的訪問權(quán)限不能縮小。
當(dāng)子類重寫超類的方法時,可以不拋出異常,如果拋出異常,則子類該方法中聲明的檢查型異常不能比超類方法中聲明的更通用。即子類重寫方法拋出的異常可以是超類方法的子類,也可以不拋出異常。
當(dāng)子類的方法簽名與超類相同,子類該方法的返回值也要與超類返回值相同或?yàn)槠渥宇悺<粗貙懽疃嘀荒芰罘祷刂蹈厥狻?/p>
字段
反射
方法 getMethod 只能獲得目標(biāo)類的所有能用所有的公共方法。
而方法 getDeclaredMethod 只能獲得類自身聲明的所有方法,這不包括繼承自超類的方法,但包括實(shí)現(xiàn)接口的方法。
如果反射調(diào)用的方法本身可以拋出異常,則當(dāng)其拋出異常時,此異常會被反射“吞掉”,封裝成 InvocationTargetException 異常重新拋出。可以使用該封裝異常的方法 getTargetException 或 getCause 來獲取被吞掉的異常。
基本類型對應(yīng)的 class 對象是通過直接在其后加后綴 .class 來獲得,而不是對應(yīng)的包裝類的 class 對象。
反射會影響代碼的可讀性,同時具有一定的危險(xiǎn)性。又因?yàn)樗奈kU(xiǎn)性,所以需要編寫額外的代碼去減弱這種危險(xiǎn),這又會帶來一定的復(fù)雜度。因此,建議在如下情況時才考慮反射:
編寫的是一種框架代碼,組內(nèi)已統(tǒng)一對反射的編寫規(guī)范。
用于對自己的外界不可訪問的方法的單元測試。
自己依賴的類在設(shè)計(jì)上不合理,但自己無法對其重構(gòu)。此時可在必要時酌情使用來擁有訪問該類內(nèi)部數(shù)據(jù)的權(quán)限。如清除封裝在 String 中的密碼等等。
【廢棄】要調(diào)用的方法有很多重載,而這些重載方法的形參之間又有繼承關(guān)系。這里需要調(diào)用形參與實(shí)參真實(shí)類型相同的一個重載方法,但此時不知道實(shí)參的真實(shí)類型,因此不能使用強(qiáng)制轉(zhuǎn)換。此時可以使用反射來獲得實(shí)參的真實(shí)類型,從而調(diào)用正確的重載方法。【廢棄。如果遇到這種情況,優(yōu)先選擇重構(gòu)而不是反射。這種情形下使用反射容易調(diào)用自己忘記編寫的不存在的方法,從而引發(fā)反射異常】
static
static 方法不會被重寫(但是,可以通過關(guān)鍵字 final 來阻止子類定義同簽名的方法。)。超類引用不能調(diào)用子類 static 方法。
因此,每個子類都有的同簽名方法不要定義為 static。
對于子類與超類同簽名的方法,有沒有使用 static 要保持一致。如果超類方法使用了 static,則子類同簽名方法也要使用 static。且 static 不能與 abstract 同時使用。
接口
public 是接口的默認(rèn)訪問控制,且接口中只能聲明 public 方法。
接口中的方法可以通過關(guān)鍵字 default 來提供實(shí)現(xiàn)。
abstract
標(biāo)記為 abstract 的方法不能在這個類中提供實(shí)現(xiàn)。
可以將抽象類的構(gòu)造器聲明成 protected,但其非抽象子類的必須聲明為 public,否則其它的普通類將無法創(chuàng)建該子類的對象。
Maven
Maven 不允許模塊之間的循環(huán)依賴。如果原來有這種需求,需要將它們都依賴的類抽取出來作為一個新模塊,以供其它模塊依賴。
Maven 的測試插件 maven-surefire-plugin 默認(rèn)只會測試如下的類方法:
-
類的訪問權(quán)限為 public,且類名含 test
-
類的默認(rèn)構(gòu)造器的訪問權(quán)限為 public
-
方法的訪問權(quán)限為 public,且方法名的前綴為 test
JUnit 注解對 Maven 默認(rèn)是無效的。在默認(rèn)情況下,使用 JUnit 注解不能改變 Maven 的測試行為。
JUnit
JUnit 注解對 Maven 默認(rèn)是無效的。在默認(rèn)情況下,使用 JUnit 注解不能改變 Maven 的測試行為。
JUnit 中的測試類的測試方法可以聲明為 default,連構(gòu)造器也可以。
如果被測試的方法為繼承自 Object 的方法,則測試方法的方法名必須加前綴或后綴(如 test)來使之不同。
對于方法 assertEquals,它的第一個是形參是期望值,第二個形參才是實(shí)際值。
總結(jié)
以上是生活随笔為你收集整理的在 Java OOP 编程中的注意事项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 中的线程安全的类
- 下一篇: Java 中使用反射来创建对象、调用方法