Programmēšana

JDK 7: Dimanta operators

Project Coin nodrošina daudzus “nelielus valodas uzlabojumus” kā jauno JDK 7 funkciju apakškopu. Es nesen blogoju par Project Coin ieslēgšanu Strings un šajā ierakstā es rakstu par jauno Diamond Operator ().

Dimanta operators samazina dažus Java daudzbalsīgumus, kas skar ģenerikas, liekot kompilatoram secināt parametru tipus vispārīgo klašu konstruktoriem. Sākotnējais priekšlikums par Diamond Operator pievienošanu Java valodai tika veikts 2009. gada februārī, un tajā ir ietverts šāds vienkāršs piemērs:

Piemēram, apsveriet šādu norīkojuma paziņojumu:

Karte anagrams = new HashMap();

Tas ir diezgan garš, tāpēc to var aizstāt ar šo:

Karte anagrams = new HashMap ();

Iepriekš minētais piemērs, kas sniegts Džeremija Mensona priekšlikumā (kas bija viens no pirmajiem, atsaucoties uz uzaicinājumu iesniegt projekta monētu idejas), ir vienkāršs, taču adekvāti parāda, kā Dimanta operators tiek piemērots JDK 7. Mansona priekšlikums arī sniedz ievērojamu nozīmi, kāpēc šis papildinājums bija vēlams:

Prasība, ka tipa parametri tiek dublēti nevajadzīgi, patīk

tas iedrošina nelaimīgo

statisko rūpnīcas metožu pārpilnība, vienkārši tāpēc, ka tas ir secinājums

strādā pie metožu piesaukšanas.

Citiem vārdiem sakot, JDK 7 projekta monētas pievienošana dimanta operatoram rada konstruktoriem tāda veida secinājumus, kas bija pieejami ar metodēm. Izmantojot metodes, netieši tiek izdarīts secinājums, kad tiek pārtraukta skaidra parametru tipa specifikācija. No otras puses, ar instantiatāciju dimanta operators ir skaidri jānorāda, lai kompilators "pateiktu" secināt veidu.

Savā sākotnējā priekšlikumā Mensons norāda, ka sintaksi bez īpaša dimanta operatora nevarēja izmantot, lai netieši secinātu par tipiem, jo ​​"atpakaļsaderības nolūkos jaunā Map () norāda neapstrādātu veidu, un tāpēc to nevar izmantot tipam secinājums. " Java pamācību Java valodas apguves taktikas vispārīgo stundu lappusē Type Inference ir sadaļa ar nosaukumu "Type Inference and Instantiation of Generic Classs", kas jau ir atjaunināta, lai atspoguļotu Java SE 7. Šajā sadaļā arī aprakstīts, kāpēc Operators ir jānorāda, lai skaidri informētu kompilatoru par tipu secinājumu izmantošanu instantizācijā:

Ņemiet vērā, ka, lai izmantotu automātiskās tipa secināšanas priekšrocības, veicot vispārīgo klases instantāciju, jums jānorāda dimanta operators. Šajā piemērā kompilators ģenerē nepārbaudītu reklāmguvumu brīdinājumu, jo konstruktors HashMap () atsaucas uz neapstrādātu veidu HashMap, nevis uz karti tips

Efektīvas Java otrā izdevuma 24. punktā ("Novērst nepārbaudītus brīdinājumus") Džošs Blohs uzsver treknrakstā teksts: "Novērsiet visus iespējamos nepārbaudītos brīdinājumus." Blohs parāda nepārbaudīta reklāmguvuma brīdinājuma piemēru, kas rodas, apkopojot kodu, kas deklarācijas labajā pusē izmanto neapstrādātu veidu. Nākamajā kodu sarakstā tiek parādīts kods, kas novedīs pie šī brīdinājuma.

galīgā karte statesToCities = jauns HashMap (); // neapstrādāts! 

Nākamie divi ekrāna momentuzņēmumi parāda kompilatora atbildi uz iepriekš minēto koda rindu. Pirmajā attēlā tiek parādīts ziņojums, ja nav iespējoti -Xlint brīdinājumi, bet otrajā redzams skaidrāks brīdinājums, kas rodas, kad -Xlint: nav pārbaudīts tiek sniegts kā arguments javac.

Ja Efektīva Java, Blohs norāda, ka šo konkrēto nepārbaudīto brīdinājumu ir viegli novērst, skaidri norādot parametru tipu vispārīgās klases ekspozīcijai. Izmantojot JDK 7, tas būs vēl vieglāk! Tā vietā, lai pievienotu skaidru tekstu ar šiem tipu nosaukumiem, daudzos gadījumos var secināt par tipiem, un dimanta operatora specifikācija liek kompilatoram izdarīt šo secinājumu, nevis izmantot neapstrādātu tipu.

Nākamais Java kodu saraksts sniedz vienkāršotus šo jēdzienu piemērus. Ir metodes, kas demonstrē neapstrādāta kopas, tūlītējas kopas, ar skaidru tā parametru veida specifikāciju, un kopas, kuras parametru tips ir secināts, dimanta operatora specifikācijas dēļ ().

iepakojums dustin.piemēri; importēt java.util.HashMap; importēt java.util.HashSet; importēt java.util.Map; importēt java.util.Set; importēt statisko java.lang.System.out; / ** * Ļoti vienkārša JDK 7 / Project Coin "Dimanta operatora" demonstrācija. * / publiskā klase DiamondOperatorDemo {/ ** “raw” veida izmantošana. * / private static Set rawWithoutExplicitTyping () {final Set names = new HashSet (); addNames (nosaukumi); atgriešanās vārdi; } / ** skaidri jānorāda vispārīgās klases instantiation parametru tips. * / private static Set explicitTypingExplicitlySpecified () {final Set names = new HashSet (); addNames (nosaukumi); atgriešanās vārdi; } / ** * Ar JDK 7 * 'Diamond Operator' tiek secināts vispārīgās klases instantiation parametru tips. * / private static Set explicitTypingInferredWithDiamond () {final Set names = new HashSet (); addNames (nosaukumi); atgriešanās vārdi; } private static void addNames (gala kopas nosaukumiToAddTo) {nosaukumiToAddTo.add ("Dustin"); namesToAddTo.add ("Rett"); namesToAddTo.add ("Homer"); } / ** * Galvenā izpildāmā funkcija. * / public static void main (pēdējie virknes [] argumenti) {out.println (rawWithoutExplicitTyping ()); out.println (explicitTypingExplicitlySpecified ()); out.println (explicitTypingInferredWithDiamond ()); }} 

Apkopojot iepriekš minēto kodu, brīdinājumu rada tikai “neapstrādāts” gadījums.

Šajā brīdī var būt ieskatīgi apskatīt, ko javap stāsta par šīm trim metodēm. Šajā gadījumā tas tiek darīts ar komandu (-v variants daudzbalsīgam sniedz visu sulīgo informāciju un -p parāda šo sulīgo informāciju par Privāts metodes):

javap -v -p -klases ceļa klases dustin.examples.DiamondOperatorDemo 

Tā kā šīs metodes visas bija vienā klasē, visai klasei ir viena izvades plūsma. Tomēr, lai būtu vieglāk tos salīdzināt, esmu izgriezis un ielīmējis izvadi formātā, kas katras metodes javap izvadi pielīdzina viens otram. Katra kolonna apzīmē javap izvade vienai no metodēm. Konkrētās metodes fonta krāsu esmu mainījis uz zilu, lai tā izceltos un apzīmētu šīs kolonnas izvadi.

Izņemot pašu metožu nosaukumus, metodē NAV atšķirības javap izeja. Tas ir tāpēc, ka Java generics tipa dzēšana nozīmē, ka diferenciācija pēc veida nav pieejama izpildlaikā. Java apmācība par vispārējiem jautājumiem ietver lapu ar nosaukumu Type Erasure, kas to izskaidro:

Kompilators noņem visu informāciju par faktiskā tipa argumentu kompilēšanas laikā.

Ir dzēsts tips, lai jaunais kods varētu turpināt mijiedarboties ar mantoto kodu. Neapstrādāta veida izmantošana jebkura cita iemesla dēļ tiek uzskatīta par sliktu programmēšanas praksi, un pēc iespējas no tā jāizvairās.

Kā mums atgādina iepriekšminētais citāts, dzēšana nozīmē, ka neapstrādāta veida baitkodēšana neatšķiras no skaidri ierakstīta parametra veida, bet arī mudina izstrādātājus neizmantot izejvielu veidus, izņemot integrāciju ar mantoto kodu.

Secinājums

Dimanta operatora iekļaušana () Java SE 7 nozīmē, ka kods, kas ģenerē vispārīgās klases, var būt mazāk izteiksmīgs. Kodēšanas valodas kopumā un it īpaši Java virzās uz tādām idejām kā konvencija par konfigurāciju, konfigurācija pēc izņēmuma un secina lietas pēc iespējas biežāk, nevis prasa skaidru specifikāciju. Dinamiski rakstītās valodas ir labi pazīstamas ar tipu secinājumiem, taču pat statiski ierakstīta Java var to paveikt vairāk nekā tā, un dimanta operators ir tā piemērs.

Sākotnējā izlikšana pieejama vietnē //marxsoftware.blogspot.com/

Šo stāstu "JDK 7: dimanta operators" sākotnēji publicēja JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found