Video: Leren programmeren door het maken van coole games 2024
Een van de oorspronkelijke ontwerpdoelen voor Java was om de taal zo eenvoudig mogelijk te houden. De ontwikkelaar van de taal heeft een aantal onnodig ingewikkelde functies van C ++ gebruikt en deze uit het venster gegooid. Het resultaat was een taal die elegant en strak was. Sommige mensen zeiden dat de taal te glad was.
Dus na een aantal jaren van discussie en gekibbel werd Java een beetje gecompliceerder. Tegen het jaar 2004 had Java typen opsommen, verbeterd voor loops, statische import en enkele andere interessante nieuwe functies. Maar de meest spraakmakende nieuwe functie was de introductie van generieke geneesmiddelen.
ArrayList-personen = nieuwe ArrayList ();
Het gebruik van iets dergelijks was nieuw in Java 5. 0. In ouderwetse Java zou je
ArrayList-mensen = nieuwe ArrayList () schrijven;
In die tijd kon een ArrayList bijna alles opslaan wat je erin wilde stoppen: een nummer, een account, een kamer, een string … wat dan ook. De klasse ArrayList was erg veelzijdig, maar met deze veelzijdigheid ontstonden er enkele hoofdpijnen. Als je iets in een ArrayList zou kunnen plaatsen, zou je niet gemakkelijk kunnen voorspellen wat je uit een ArrayList zou krijgen.
In het bijzonder kon je niet gemakkelijk code schrijven die aannam dat je bepaalde soorten waarden in de ArrayList had opgeslagen. Hier is een voorbeeld:
ArrayList things = new ArrayList (); dingen. toevoegen (nieuw account ()); Account myAccount = dingen. te krijgen (0); // GEBRUIK DIT NIET. HET IS SLECHTE CODE.
In de derde regel pakt de call to get (0) de vroegste waarde in de verzameling van items. De aanroep om te krijgen (0) is goed, maar dan verslikt de compiler zich in de poging tot toewijzing aan mijn account. U krijgt een bericht op de derde regel met de mededeling dat alles wat u uit de dingenlijst krijgt, niet in de variabele myAccount kan worden gestopt.
Je krijgt dit bericht omdat, tegen de tijd dat de compiler de derde regel bereikt, het is vergeten dat het item dat op de tweede regel is toegevoegd van het type Account is!
De introductie van generieke oplossingen lost dit probleem op:
ArrayList things = new ArrayList (); dingen. toevoegen (nieuw account ()); Account myAccount = dingen. te krijgen (0); // GEBRUIK DEZE CODE IN PLAATS. HET IS GOEDE CODE.
Door op twee plaatsen toe te voegen, vertelt de compiler dat dingen Account-instanties opslaan - niets anders. In de derde regel van de voorgaande code krijgt u dus een waarde uit de verzameling dingen. Omdat de dingen alleen accountobjecten opslaan, kunt u myAccount verwijzen naar die nieuwe waarde.
Java 5. 0 heeft generieken toegevoegd aan Java. Maar kort na de geboorte van Java 5. 0 merkten programmeurs hoe onhandig de code voor generieke geneesmiddelen kan zijn.U kunt immers generieke generieken creëren. Een ArrayList kan een aantal arrays bevatten, waarvan elk een ArrayList kan zijn. U kunt dus
ArrayListmess = new ArrayList () schrijven;
Alle herhalingen in die puinhoopverklaring geven programmeurs hoofdpijn! Om deze lelijkheid te voorkomen, hebben Java 7 en latere versies een diamantoperator , . De diamantoperator laat Java weten wat voor waanzinnig ingewikkelde dingen je in het vorige deel van de generieke verklaring plaatst.
In dit voorbeeld vertelt Java aan hergebruik
ArrayListrommel = nieuwe ArrayList ();
In Java 7 en hoger kunt u een van deze puinhypotheses schrijven: de originele, vervelende verklaring met twee exemplaren van ArrayList [], of de gestroomlijnde (slechts mild vervelende) verklaring bij de diamantoperator en slechts één ArrayList [] optreden.
Ja, de gestroomlijnde code is nog steeds gecompliceerd. Maar zonder alle ArrayList [] herhalingen is de gestroomlijnde code minder omslachtig. De Java 7-diamantoperator neemt één kans weg om iets verkeerd te kopiëren en heeft een grote fout in uw code.