Mitä ' Uusi' – hakusana oikeastaan tekee Javassa, ja pitäisikö minun välttää uusien objektien luomista?

Kyllä, jos soitit myMethod() 10 kertaa se luo 10 uniikkia ja erillistä esinettä.

new avainsana tekee juuri niin kuin tinalla lukee, se luo aivan uuden esineen riippumatta siitä, onko sellainen jo olemassa. Se luo uuden objektin ja stuffs viittaus että objekti sisällä muuttuja se on annettu, korvaa aiemman arvon (objekti) muuttujan hallussa.

onko myObject-muuttuja sijoitettu uudelleen joka kerta?

jälleen, kyllä se allokoitaisiin uudella kohteella joka kerta, kun menetelmää kutsuttiin. Mielenkiintoinen huomio tästä olisi se, että muuttujaa ei” oikeastaan ”jaettaisi uudelleen, koska määrittelet muuttujan itse metodivartalon sisällä, joten aina kun menetelmä päättyy, se poistaa muuttujat, jotka on määritelty sen” soveltamisalan puitteissa. Joten mitä se todella tekee on luoda 10 yksittäisiä muuttujia ja määrittää 10 yksittäisiä objekteja, vaikka kuten sanoin muut olisi pitänyt poistaa automaattisesti, jotta se ei käytä mitään lisämuistia.

pähkinänkuoressa: Pitäisikö minun kirjoittaa tuollaista koodia vain, jos aion vedota siihen menetelmään vain kerran?

kuten sanoin, yllä olevassa esimerkissä jokainen objekti tuhottaisiin metodin suorittamisen lopussa (olettaen, ettet antanut objektiviittausta metodin soveltamisalan ulkopuoliselle muuttujalle), joten esimerkissäsi voit soittaa metodille mielelläsi niin monta kertaa kuin haluat, mutta joka kerta ei olisi millään tavalla yhteydessä edellisiin puheluihin.

ymmärrän, että kirjoitustapani voi olla hämmentävä, joten jos haluat minun selventävän jotain, Kysy vain.

” miksei FileWriter, FileReader, BufferedReader ja BufferedWriter julistettaisi luokan kärkeen kuten muidenkin muuttujien kohdalla?”

okei, Oletan sinun ymmärtävän, että muuttujia ei varsinaisesti kutsuta FileWriter, FileReader, BufferedReader, ja BufferedWriter, mutta pikemminkin tämä on muuttujan tyyppi. Niiden nimet ovat fw, fr, br, ja bw. Jos et ymmärrä, mitä tarkoitan, Kysy. Tästä lähtien viittaan muuttujiin nimillä, jotka teitte lukemisen helpottamiseksi, kun all fw tarkoittaa vain FileWriter joka tapauksessa, joten ei pitäisi olla liikaa sekaannusta.

tämän kysymyksen avain on piilotettu itse muuttujien nimiin. Huomaa, miten ne joko päättyvät Reader tai Writer tämä voi antaa meille hienovaraisen vihjeen niiden käytöstä. Selvästi FileWriter ja BufferedWriter liittyvät ulostuloon jollain tavalla. Koodia katsomalla huomaamme, että epäilyksemme olivat oikeita ja että näitä muuttujia ei esiinny missään muualla kuin writeText(JTextArea area) – menetelmän sisällä. Jos muuttujaa ei siis käytetä missään muualla koodin sisällä, olisi loogista määritellä ja alustaa ne siinä menetelmässä, jossa niitä käytetään, se ei ainoastaan tee koodista helppolukuisempaa, koska silloin ”tiedämme”, että nämä muuttujat liittyvät vain kyseiseen menetelmään, vaan sillä on myös se etu, että nämä muuttujat poistetaan menetelmän suorittamisen lopussa, jolloin ei jää muuttujia, joita käytettiin vain hyvin lyhyesti. Näillä säännöillä voidaan sanoa, että sama pätee FileReader ja BufferedReader.

Huomaa Tämä esimerkki muuttuvasta laajuudesta. (Katso kommentteja lisäsin koodi)

public class DataBase {private static String buf, retString = "\n"; // buf & retString - createdprivate static File file = new File("test.txt"); // file - createdpublic static void readText(JTextArea area) { try { FileReader fr = new FileReader (file); // fr (FileReader) - created BufferedReader br = new BufferedReader(fr); // br (BufferedReader) - created while ((buf = br.readLine()) != null) { area.append(buf); area.append(retString); } br.close(); fr.close(); } // fr (FileReader & br (BufferedReader) - destroyed catch (IOException e) { System.out.println("Exception: " + e); }}public static void writeText(JTextArea area) { try { FileWriter fw = new FileWriter (file); // fw (FileWriter) - created BufferedWriter bw = new BufferedWriter(fw); // bw (BufferedWriter) - created bw.write(area.getText()); bw.close(); fw.close(); } // fw & bw - destroyed catch (IOException e) { System.out.println("Exception: " + e); }}} // buf, retString and file - Still exist as long as the object exists

tästä esimerkistä käy selvemmäksi, miksi muuttujat on määritelty menetelmissä eikä instanssimuuttujina ja alustettu konstruktorin sisällä. Se mahdollistaa paljon puhtaampaa koodia sekä on enemmän readabe.

miksi se tehdään joka kerta, kun menetelmää kutsutaan, sen sijaan että käytettäisiin ehkä samaa instanssimuuttujaa?

No tämä kysymys liittyy muuttuviin tyyppeihin. Emme voineet käyttää yhtä muuttujaa uudelleen kaikille tiedoille, koska tyyppien olisi pitänyt olla erilaisia.

jos otamme kaikki muuttujat koodista

private static String buf, retString = "\n"; // validprivate static File file = new File("test.txt"); // validFileReader fr = new FileReader (file); // validBufferedReader br = new BufferedReader(fr); // validFileWriter fw = new FileWriter (file); // validBufferedWriter bw = new BufferedWriter(fw); // valid

nyt tiedämme, että emme voi sijoittaa arvoa, joka ei ole samaa tyyppiä kuin muuttuja, kyseiseen muuttujaan niin jotain

FileReader fr = new BufferedReader(fr); // Is not valid!

, koska tyypit eivät yksinkertaisesti täsmää.

käykö järkeen?

You might also like

Vastaa

Sähköpostiosoitettasi ei julkaista.