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