Nasanay na kami sa katotohanan na may lumalabas na bagong release ng JDK tuwing anim na buwan. Sa ngayon, ang diskarte na ito ay nabigyang-katwiran ang sarili nito, at ang mga alalahanin ng ilang mga developer na hindi sila makakasabay sa mga pag-update ay naging walang kabuluhan: may ilang anim na buwang pagbabago at hindi na sila global gaya ng dati. Buweno, maaaring hindi mapansin ng mga baguhang programmer ang pagbabago. Gayunpaman, mas mabuti para sa mga developer ng software sa hinaharap na manatiling abreast ng mga inobasyon. Sa artikulong ito, tradisyonal naming ilalarawan ang mga tinanggap na panukala sa pagpapalawig (JEPs). Ang Java 13 ay kinabibilangan lamang ng limang JEP at 76 na bagong pangunahing elemento ng library (na halos kalahati ay mga simpleng karagdagan sa java.io package).
JEP 355 : Text Blocks(Preview)
Magsimula tayo sa pagbabago ng syntax ng wika. Ang pinakamahalaga sa kanila ay mga bloke ng teksto. Pinapayagan ka nitong maiwasan ang pagtakas ng mga character at malaman kung paano i-format ang mga string. Maaari mong tandaan na hindi kasama sa JDK 12 ang inaasahang tampok na Raw String Literals (JEP 326) para sa pagtatrabaho sa mga literal na string. Sa Java 13, pinalitan ito ng JEP 355 kasama ang mga text block nito. Marahil ay naaalala mo na sa Java, ang isang string ay nakabalot sa mga dobleng panipi. Maganda ito, ngunit ang problema ay hindi maaaring sakupin ng isang linya ang higit sa isang linya ng source file (upang maiwasan ang pagkalito sa isang linya ng Java, dito tatawagin natin ang isang linya ng file bilang "linya"). Buweno, maglibot tayo at gamitin, halimbawa, ang simbolo\n
kung kinakailangan ng pahinga, o pagsasama-sama ng mga multiline na expression. Hindi maganda ang lalabas! Ang mga literal na teksto na may naka-embed na HTML, XML, SQL, o JSON na mga fragment ay lalong mahirap. Ang lahat ng escaping, concatenation, at manu-manong pag-edit na ito ay ginagawang hindi maginhawang isulat at mahirap basahin ang code. Sinusubukan ng mga bloke ng teksto na lutasin ang problemang ito. Nagsisimula sila uh... na may triple double quotes at nagtatapos sa kanila (alam ko, hindi ito masyadong maganda). Ang lahat sa pagitan ng mga quote ay binibigyang kahulugan bilang bahagi ng linya, kabilang ang mga bagong linya. Ang mga bloke ng teksto ay maaaring gamitin nang eksakto kapareho ng mga karaniwang literal na teksto, at ang Java ay bubuo ng code sa parehong paraan. Ang pagbubukas ng mga quote ay dapat na sinundan ng isang line delimiter; hindi magagamit ang mga text block sa isang linya, kaya ang code
String smallBlock = """Only one line""";
hahantong sa mga sumusunod na pagkakamali:
TextBlock.java:3: error: illegal text block open delimiter sequence, missing line terminator
String smallBlock = """Text Block""";
^
TextBlock.java:3: error: illegal text block open delimiter sequence, missing line terminator
String smallBlock = """Text Block""";
^
Ang isang simpleng HTML fragment ay maaari na ngayong isulat tulad nito:
String htmlBlock = """
<html>
<body>
<p>CodeGym Web page</p>
</body>
<html>
""";
Magbanggit tayo ng ilang mga subtleties na mas mahusay na malaman kapag gumagamit ng mga bloke ng teksto. Ang paglalagay ng mga pagsasara ng mga panipi ay lumalabas na mahalaga: tinutukoy nito kung paano pinangangasiwaan ang paminsan-minsang puting espasyo. Sa halimbawa sa itaas, ang mga pansarang panipi ay nakahanay sa indentasyon ng HTML na teksto. Sa kasong ito, aalisin ng compiler ang mga puwang ng indentation, at bilang resulta ay makakakuha tayo ng linyang tulad nito:
<html>
<body>
<p>My web page</p>
</body>
</html>
Tandaan:ang nasabing linya ay maglalaman ng bagong linya sa dulo ng linya. Kung hindi ito kailangan, ang pagsasara ng mga quote na """ ay maaaring ilagay nang direkta pagkatapos ng tag na </html>. Kung ililipat namin ang pagsasara ng mga panipi sa kaliwang margin, babaguhin nito ang dami ng indentation na inalis. Kung ililipat namin ang mga ito ng dalawang puwang sa kaliwa, magdaragdag kami ng dalawang puwang para sa indentation sa bawat linya ng linya. Ang paglipat sa kaliwang gilid ay magiging sanhi ng lahat ng padding na mapangalagaan. Ang paglipat ng mga quote sa kanan ay walang epekto at hindi na magdaragdag ng anumang indentation. Ang mga bloke ng teksto ay isinama sa JDK 13 bilang tampok na preview. Nangangahulugan ito na hindi pa sila kasama sa kaukulang detalye ng wikang Java. Ibig sabihin, hindi malinaw kung magiging permanenteng bahagi ng wika ang feature na ito o kung panauhin lang ito dito. Sa kasalukuyan, maaaring subukan ng mga developer ang tampok at magbigay ng kanilang opinyon dito. Ang kapalaran ng mga bloke ng teksto ay nakasalalay dito: ang tampok ay maaaring mapabuti, at kung hindi mo gusto ito, maaari itong alisin nang buo. Kung gusto mong subukan ang mga text block sa pagsasanay, tandaan na ang mga feature ng preview ay dapat na tahasang isama upang makapag-compile at tumakbo. Compilation:
javac --enable-preview --release 13 TextBlock.java
Upang patakbuhin ang application, kailangan mong paganahin ang mga feature ng preview:
java --enable-preview TextBlock
Ang klase String
ay may tatlong bagong pamamaraan na umakma sa pagbabagong ito ng wika:
formatted()
: Mag-format ng string gamit ang string mismo bilang format string. Katumbas ng isang hamonformat(this, args)
stripIndent()
: Tinatanggal ang mga random na espasyo mula sa isang string. Kapaki-pakinabang ito kung nagbabasa ka ng mga multiline na string at gusto mong ilapat ang parehong pagbubukod ng whitespace gaya ng gagawin mo sa isang tahasang deklarasyon.translateEscapes()
: Nagbabalik ng string na may mga escape sequence (tulad ng\ r
), isinalin sa naaangkop na Unicode value.
@PreviewFeature
sa mga ganitong sitwasyon, ngunit hindi pa ito kasama sa JDK (bagama't may mataas na antas ng posibilidad na lilitaw ito sa JDK 14).
JEP 354 : Switch Expression (Preview)
Ipinakilala ng Java 12 ang isang panukala para sa isang bagong anyo ng pagsulat ng mga expression na may switch statement - JEP 325 . Ito ay naging pinakaunang tampok na preview at ang kapalaran nito ay nagpapatunay na ang pagsusumite ng mga panukala sa mga user ay isang magandang ideya. Bago ang JDK 12,switch
maaari lang itong gamitin bilang isang pahayag na nagsasagawa ng pagkilos ngunit hindi nagbabalik ng resulta. Ngunit sa Java 12 pinahintulutan itong magamit switch
bilang isang expression na nagbabalik ng isang resulta na maaaring italaga sa isang variable. Mayroong iba pang mga pagbabago sa syntax ng mga pahayag ng kaso sa loob ng switch
. Tingnan natin ang isang halimbawa mula sa JEP upang maunawaan kung paano ito gumagana.
int numberOfLetters;
switch(dayOfWeek) {
case MONDAY:
case FRIDAY:
case SUNDAY:
numberOfLetter = 6;
break;
case TUESDAY
numberOfLetter = 7;
break;
case THURSDAY
case SATURDAY
numberOfLetter = 8;
break;
case WEDNESDAY
numberOfLetter = 9;
break;
default:
throw new IllegalStateException("Huh?: " + day);
}
Sa halimbawang ito, ginagamit namin ang halaga dayOfWeek
upang italaga ang halaga sa numberOfLetters
. Dahil sa mga kakaibang gawain ng operator switch
, ang code na ito ay hindi ang pinakamaganda at madaling magkamali. Una, kung nakalimutan naming maglapat ng pahayag break
sa bawat pangkat ng mga label ng kaso, magiging default kami sa susunod na pangkat ng mga label ng kaso. Ito ay maaaring humantong sa mga error na mahirap hanapin. Pangalawa, dapat nating tukuyin ang bawat pangkat ng mga label ng kaso. Kung nakalimutan natin, kung gayon, siyempre, makakakuha tayo ng error sa compiler, gayunpaman, ang pagpipiliang ito ay hindi perpekto. Medyo verbose din ang aming code dahil ang bawat value dayOfWeek
ay dapat may sariling case label. Gamit ang bagong syntax, nakakakuha kami ng mas malinis at mas kaunting error-prone na code:
int numberOfLetters = switch (dayOfWeek) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
default -> throw new IllegalStateException("Huh?: " + day);
};
Ngayon kailangan lang nating gawin ang pagtatalaga (mula sa return switch
value ng expression) at maaaring gumamit ng comma-separated list para sa mga case label. At, dahil hindi namin ginagamit ang operator break
, inaalis namin ang mga problemang nauugnay dito. Ang expression na syntax switch
ay nagpapahintulot sa amin na gumamit ng mas lumang istilong syntax, kaya sa JDK 12 maaari naming isulat ito tulad nito:
int numberOfLetters = switch (dayOfWeek) {
case MONDAY:
case FRIDAY:
case SUNDAY:
break 6;
case TUESDAY
break 7;
case THURSDAY
case SATURDAY
break 8;
case WEDNESDAY
break 9;
default:
throw new IllegalStateException("Huh?: " + day);
};
Ayon sa komunidad ng Java, ang paggamit ng overloading break
upang tukuyin ang isang return value ay maaaring nakakalito. Ang wikang Java ay nagpapahintulot din sa iyo na gumamit ng break
( at continue
) na may label tulad ng unconditional jump operator goto
. Binago ng JEP 354 ang paggamit na ito break
, kaya sa Java 13 ang aming code ay bahagyang nagbabago:
int numberOfLetters = switch (dayOfWeek) {
case MONDAY:
case FRIDAY:
case SUNDAY:
yield 6;
case TUESDAY
yield 7;
case THURSDAY
case SATURDAY
yield 8;
case WEDNESDAY
yield 9;
default:
throw new IllegalStateException("Huh?: " + day);
};
Ang susunod na tatlong JEP ay nauugnay sa Java Virtual Machine.
JEP 350 Dynamic na CDS Archive
Binibigyang-daan ka ng extension na ito na dynamic na mag-archive ng mga klase sa dulo ng pagpapatupad ng Java application. Nagbibigay-daan sa iyo ang CDS o Class Data Sharing na i-pack ang lahat ng klase na inilunsad sa startup sa isang espesyal na archiveclass data sharing
, gamit ang listahan ng parehong mga klase bilang default. Ito ay humahantong sa isang makabuluhang acceleration sa paglulunsad ng mga application at pag-save ng RAM. Dati, ang paggamit ng AppCDS ay isang multi-step na proseso na nagsasangkot ng paggawa ng listahan ng mga nauugnay na klase at paggamit sa listahang iyon upang lumikha ng archive na gagamitin para sa mga susunod na pagtakbo. Ngayon ang kailangan lang ay isang paglulunsad ng application na may -XX: flag ArchiveClassesAtExit
na nagpapahiwatig ng lokasyon kung saan isusulat ang archive. Sa diskarteng ito, ang mga klase ay awtomatikong naka-package sa isang archive pagkatapos na ihinto ang application nang normal.
JEP 351 ZGC : I-uncommit ang hindi nagamit na memorya
Isang taon na ang nakalipas, ipinakilala ng JDK 11 ang ZGC, isang pang-eksperimentong, scalable, low-latency na kolektor ng basura. Sa una, medyo kakaiba ang pagkilos ng ZGC: hindi nito pinahintulutan na maibalik ang memorya sa operating system, kahit na hindi na ito kailangan. Para sa ilang kapaligiran, gaya ng mga lalagyan, kung saan ang mga mapagkukunan ay ginagamit ng maraming serbisyo nang sabay-sabay, maaari nitong limitahan ang scalability at kahusayan ng system. Ang ZGC heap ay binubuo ng tinatawag na ZPages. Kapag na-clear ang ZPages sa panahon ng cycle ng koleksyon ng basura, ibabalik ang mga ito sa ZPageCache. Ang mga ZPages sa cache na ito ay inayos ayon sa kung gaano katagal ginamit ang mga ito. Sa Java 13, ibabalik ng ZGC sa operating system ang mga page na natukoy na hindi ginagamit sa loob ng mahabang panahon. Sa ganitong paraan maaari silang magamit muli para sa iba pang mga proseso.JEP 353 Muling ipatupad ang legacy na Socket API
Ang parehong pagpapatupad ng APIjava.net.Socket
ay java.net.ServerSocket
JDK 1.0 pa rin. Dito, at lahat ng kasunod na JDK, ang pagpapatupad ng mga API na ito ay gumagamit ng ilang mga diskarte (gaya ng paggamit sa thread stack bilang isang I/O buffer) na ginagawang hindi nababaluktot at mahirap na panatilihin ang mga ito. Upang malutas ang problemang ito, isang bagong pagpapatupad ang ibinigay sa JDK 13 NioSocketImpl
. Hindi na ito nangangailangan ng native code, na ginagawang mas madali ang pag-port sa iba't ibang platform. Ginagamit din ng klase na ito ang umiiral na mekanismo ng buffer cache (pag-iwas sa paggamit ng thread stack para sa layuning ito) at pag-lock java.util.concurrent
sa halip na mga naka-synchronize na pamamaraan. Pasimplehin nito ang pagsasama sa mga hibla mula sa Project Loom .
Mga bagong API
Nabanggit namin kanina na ang Java 13 ay may kasamang 76 na bagong API sa mga base class na library. Sinasaklaw nila ang mga sumusunod na lugar:- Mga update sa suporta ng Unicode.
- Tatlong bagong paraan
String
upang suportahan ang mga bloke ng teksto (tingnan ang paglalarawan ng JEP 255 sa itaas). - Ang mga klase
java.nio
ay mayroon na ngayong ganap (kumpara sa kamag-anak)get
atitakda ang mga pamamaraan. Sila, tulad ng base abstract class Buffer
, ay may kasamang paraanslice()
para sa pagkuha ng bahagi ng buffer. force()
Pinipilit ng class methodMappedByteBuffer
ang isang buffer section na isulat sa backing storage nito.nio.FileSystem
nagdaragdag ng tatlong bagong overloaded na mga formnewFileSystem()
para sa pag-access sa mga nilalaman ng isang file bilang isang file system.- Isang bagong kawili-wiling paraan ang
javax.annotation.processing.ProcessingEnvironment
lumitaw.isPreviewEnabled()
. Sasabihin nito sa iyo kung pinagana ang mga feature ng preview. Ito ay kawili-wili dahil ang anotasyong binanggit sa itaas@PreviewFeature
ay hindi magiging available hanggang sa mailabas ang JDK 14. DocumentBuilderFactory
atSAXParserFactory
kumuhajavax.xml.parsers
ng tatlong bagong pamamaraan para sa paglikha ng mga pagkakataong may kamalayan sa namespace.
GO TO FULL VERSION