Alustuslohko on olio-ohjelmoinnin konsepti , joka tunnetaan pääasiassa Java-kielestä ja joka on luokkien ja objektien luomisen ( latauksen ) aikana suoritettava komentosarja . Suunniteltu lisäämään huomattavasti rakentajan tehoa . On olemassa kahta tyyppiä: staattinen alustuslohko, jota yleisesti kutsutaan lyhennettynä staattiseksi lohkoksi, ja dynaaminen alustuslohko (instanssilohko).
Kun objekti luodaan, suoritetaan useita konstruktorissa määritettyjä komentoja. Joskus on tarpeen laajentaa syntaksin mahdollisuuksia. Tyypillisesti dynaaminen lohko on olemassa vain mukavuuden vuoksi - se voidaan helposti korvata lisäämällä latausfunktio ja kutsumalla se jokaiselta rakentajalta. Staattinen lohko kuitenkin lisää huomattavasti ohjelman toimivuutta ja siksi sitä käytetään paljon useammin.
Staattinen lohko on pohjimmiltaan koko luokan rakentaja. Sen syntaksi on:
... staattinen { // Staattinen lohkokoodi } ...Se sijoitetaan kenttämääritelmien ja luokkafunktioiden väliin. Komennot suoritetaan kahdessa tapauksessa sen mukaan, kumpi tulee ensin:
Toisin sanoen koodi suoritetaan, kun luokka ladataan ensimmäisen kerran. Tässä esimerkissä haluamme luoda luokan, joka mallintaa tietyn yrityksen valmistamia autoja ja ylläpitää niitä pysyäkseen kirjaa niiden olemassaolosta, mukaan lukien nykyinen tilanne, omistajat, korjaushistoria jne. Jokainen esine on auto , ja luokassa on staattinen kenttä, joka sisältää tietokannan kaikista autoista. Perustuu karttarakenteeseen, kun avain on automalli ja sisältö on ryhmä kyseisen mallin autoja. Seuraava koodi osoittaa staattisen alustuslohkon käytön:
julkisen luokan auto { staattinen kartta < merkkijono , sarja < auto >> luettelo ; static { katalogi = uusi HashMap < String , Set < Auto >> (); katalogi . put ( "malli105" , new HashSet < Auto > ()); katalogi . put ( "malli125" , uusi HashSet < Auto > ()); katalogi . put ( "malli140" , uusi HashSet < Auto > ()); katalogi . put ( "malli201" , uusi HashSet < Auto > ()); } julkinen auto ( merkkijonomalli ) { _ katalogi . hanki ( malli ). lisää ( tämä ); //... } //... }Linja 4 voidaan helposti kiinnittää linjaan 2 ilman staattista lohkoa. Kuitenkin rivit 5-8 osoittavat sen tarpeen - kykyä suorittaa monimutkaisia komentoja luokkatasolla, jotka objektitasolla ilmestyisivät konstruktoriin.
Dynaaminen lohko on lisä konstruktoriin. Sen syntaksi on:
... { // Ilmentymän estokoodi } ...Se sijoitetaan kenttämääritelmien ja luokkafunktioiden väliin. Komennot suoritetaan, kun objekti on luotu. Dynaaminen lohko on lisäosa, joka helpottaa rakentajan kirjoittamista, eikä se tuo lisätoimintoja. Sen avulla voit tallentaa käynnistystoiminnon luomisen ja sen kutsun lisäämisen kaikilta rakentajilta. Esimerkiksi koodinpätkä:
julkisen luokan auto { staattinen int count = 0 ; julkinen auto ( merkkijonomalli ) { _ init (); //... } julkinen auto ( String - malli , tuplahinta ) { init (); //... } yksityinen void init () { laskea ++ ; Järjestelmä . ulos . println ( "Hei kaikille, meillä on nyt " + count + " autoja!" ); } //... }vastaa koodia:
julkisen luokan auto { staattinen int count = 0 ; julkinen auto ( merkkijonomalli ) { _ //... } julkinen auto ( String - malli , tuplahinta ) { //... } { laskea ++ ; Järjestelmä . ulos . println ( "Hei kaikille, meillä on nyt " + count + " autoja!" ); } //... }Java-kielen suunnittelun aikana muodostettiin johdonmukainen latausjärjestys. Luokan latauksen aikana järjestys on seuraava:
Sitten kun objekti on luotu, järjestys on seuraava:
Kun esi-isäketju on olemassa, kaikki toiminnot suoritetaan ensin kaukaisimmalle esi-isälle (luokka Object) ja sitten ketjua alaspäin samassa järjestyksessä nykyiseen luokkaan.
Jos samassa osiossa on useampi kuin yksi tyyppi, vaiheet suoritetaan siinä järjestyksessä, jossa ne näkyvät ohjelmassa. Esimerkiksi seuraava koodi:
julkinen luokka T { staattinen int i = 5 ; static { i = 10 ; } static { i = i * 3 ; } }antaa kunkin objektin muuttujalle i arvon 30. Mutta koodi:
julkinen luokka T { static { i = 10 ; } staattinen int i = 5 ; static { i = i * 3 ; } }antaa arvon 15. Eli ensin luodaan kenttä ja sitten kaikki toiminnot suoritetaan ohjelmassa määritetyssä järjestyksessä - ensimmäinen lohko, sitten kentän alustus, sitten toinen lohko.
Toisin kuin saatat odottaa, seuraava koodi:
julkinen luokka T { static { i = 5 ; i = i + 1 ; } staattinen int i = 5 ; }ei pysty kääntämään rivillä 4, koska oikeaa muuttujaa i käytettiin ennen sen määrittelyä, vaikka rivi 3 kääntää ja toimii ongelmitta, vaikka rivin 4 vasen i ei aiheuta virhettä, ja huolimatta siitä, että toiminnan aikana, kun rivin 4 alku on saavutettu, muuttuja määriteltiin ja se sai arvon. Tämä johtuu siitä, että muuttujien sijoittelu (esimerkiksi rivillä 3) tarkistetaan ohjelman suorituksen aikana määritettyyn muuttujaluetteloon, mukaan lukien kaikki staattiset kentät, ja tällaisen muuttujan käyttö tarkistetaan määritelmän sijainnin perusteella.
Toisin kuin saatat odottaa, seuraava koodi:
julkinen luokka T { static { int i = 10 ; } public static void main ( String [ ] args ) { Järjestelmä . ulos . println ( i ); } }epäonnistuu kääntäminen rivillä 6 sillä perusteella, että muuttujaa ei ole määritelty, koska muuttujan määrittäminen staattiseen lohkoon ei luo staattista muuttujaa, vain paikallisen muuttujan kyseiseen lohkoon. Eli koodi ei ole sama kuin koodi . static {int i = 10;}static int i = 10;