Java開(kāi)發(fā)平臺(tái)intellij idea使用教程:如何在IntelliJ IDEA中使用JAVA15(下)
IntelliJ IDEA是Java語(yǔ)言開(kāi)發(fā)的集成環(huán)境,IntelliJ在業(yè)界被公認(rèn)為優(yōu)秀的Java開(kāi)發(fā)工具之一,尤其在智能代碼助手、代碼自動(dòng)提示、重構(gòu)、J2EE支持、Ant、JUnit、CVS整合、代碼審查、 創(chuàng)新的GUI設(shè)計(jì)等方面的功能可以說(shuō)是超常的。雙節(jié)福利來(lái)襲!IntelliJ正版授權(quán)最高立減2000!點(diǎn)擊查看詳情!
IntelliJ IDEA配置2020年7月發(fā)布的IntelliJ IDEA 2020.2支持Java 15功能。您可以通過(guò)將Project SDK選擇為15,并將“Project language level”選擇為“ 15(預(yù)覽)–密封類型,將其配置為使用Java 15”,“記錄,模式,本地枚舉和接口”,用于您的項(xiàng)目和模塊設(shè)置。
Java 15將在2020年9月15日發(fā)布GA(General Availability),之后您還可以直接從IntelliJ IDEA下載它。為此,請(qǐng)單擊“Platform Settings”下的SDK,然后單擊頂部的“ +”號(hào),選擇“下載JDK”,然后選擇供應(yīng)商以及版本和目錄,以將JDK下載到該目錄。
重訪Gardner類中的Plant類型創(chuàng)建密封的層次結(jié)構(gòu)后,您將能夠以精確的方式處理層次結(jié)構(gòu)中的實(shí)例,而無(wú)需處理任何“general”實(shí)現(xiàn)。process類中的方法Gardner將無(wú)法運(yùn)行該else子句。但是,if– else構(gòu)造的語(yǔ)法仍然需要您定義else部件(在將來(lái)的Java版本中可能會(huì)更改)。
在Java 14中為instanceof的模式匹配引入的Type-test-patterns可以在將來(lái)的Java版本中添加到開(kāi)關(guān)表達(dá)式中。使用增強(qiáng)的switch表達(dá)式,您可以使用詳盡的擴(kuò)展類型列表。這使您可以消除為Plant傳遞給方法的不匹配類型而執(zhí)行的任何“general code”的定義processInAFutureJavaVersion:
// This code doesn't work in Java 15. // It would work in a future Java version after the addition of // type-test-pattern to the switch expressions int processInAFutureJavaVersion(Plant plant) { return switch (plant) { case Cucumber c -> c.harvestCucumber(); case Climber cl -> cl.sowClimber(); case Herb h -> h.sellHerb(); case Shrub s -> s.pruneShrub(); } }封裝和模塊限制
密封的類及其實(shí)現(xiàn)不能跨越多個(gè)模塊。如果在命名模塊中定義了密封的基類,則其所有實(shí)現(xiàn)都必須在同一模塊中定義。但是,它們可以出現(xiàn)在不同的程序包中。
對(duì)于在未命名模塊中定義的密封類,其所有實(shí)現(xiàn)都必須在同一包中定義。
基本和擴(kuò)展類的規(guī)則擴(kuò)展密封類的類必須是最終的,未密封的或密封的。非密封類允許其他類對(duì)其進(jìn)行擴(kuò)展。密封的子類必須遵循與父基類相同的規(guī)則集–可以通過(guò)其他類的顯式列表進(jìn)行擴(kuò)展。
密封的類也可以是抽象的。擴(kuò)展類可以定義為抽象或具體類。
讓我們修改上一節(jié)中使用的類集,Plant并使用abstract方法將類定義為抽象類grow()。由于派生類Herb是最終類,因此必須實(shí)現(xiàn)method grow()?,F(xiàn)在,未密封的派生類Shrub是一個(gè)抽象類,它可能無(wú)法實(shí)現(xiàn)方法grow()。如果不需要將其定義為抽象類,則密封派生類將Climber實(shí)現(xiàn)abstract方法grow():
sealed abstract public class Plant permits Herb, Shrub, Climber { abstract void grow(); } final class Herb extends Plant { @Override void grow() { } } non-sealed abstract class Shrub extends Plant {} sealed class Climber extends Plant permits Cucumber{ @Override void grow() { } } final class Cucumber extends Climber {}
密封接口
密封接口允許您顯式指定可以擴(kuò)展它的接口以及可以實(shí)現(xiàn)它的類(包括記錄)。它遵循類似于密封類的規(guī)則。
但是,由于您不能使用修飾符聲明接口final(因?yàn)檫@樣做會(huì)與接口的用途發(fā)生沖突,因?yàn)楸仨殞?shí)現(xiàn)接口),可以使用sealed或non-sealed修飾符聲明繼承接口。permits接口聲明的子句列出了可以直接實(shí)現(xiàn)密封接口和擴(kuò)展接口的類。一個(gè)實(shí)現(xiàn)類可以是最終的,密封的或非密封的。由于Java 14中引入的記錄是隱式最終的,因此它們不需要任何其他修飾符:
這是供參考的代碼:
sealed public interface Move permits Athlete, Person, Jump, Kick { } final class Athlete implements Move {} record Person(String name, int age) implements Move {} non-sealed interface Jump extends Move {} sealed interface Kick extends Move permits Karate {} final class Karate implements Kick {}
好了這就是今天的內(nèi)容了,你學(xué)會(huì)了嗎?如果今天的文章未解決你的需求,可點(diǎn)擊獲取更多免費(fèi)教程。不要忘了在評(píng)論與我們分享您的想法和建議,現(xiàn)IntelliJ正版授權(quán)在線訂購(gòu)最高立減3000元!