Programiranje

Vrednost String.valueOf

Večina razvijalcev Jave je verjetno že napolnila NullPointerException. Večina od nas se je naučila, kako pomembne so nekatere stvari, s katerimi zmanjšujemo "možnosti" srečanja z NullPointerException. Dejansko obstaja Wiki stran, namenjena preprečevanju ali zmanjševanju NullPointerExceptions.

Več ljudi se je zavzelo za dodatno jezikovno podporo za boljše in lažje ravnanje z morebitnimi ničelnimi vrednostmi. Sem spadajo predlogi Java SE 7, optimizirano preverjanje nule in teza Kinge Dobolyi Spreminjanje semantike Java za obravnavo izjem iz ničelnih kazalcev.

Med številnimi stvarmi, ki jih lahko že precej enostavno naredimo, da bi zmanjšali svoja srečanja z NullPointerException, je eno posebno enostavno narediti String.valueOf (Object), kadar je to primerno. The String.valueOf (objekt) metoda, kot navaja Javadoc-generirana dokumentacija, vrne "null", če je posredovani objekt nič in vrne rezultate o predanem Predmetje klic toString (), če je predan Predmet ni nič. Z drugimi besedami, String.valueOf (String) opravi preverjanje nič za vas.

Uporaba String.valueOf (objekt) je še posebej koristno pri izvajanju toString metode v razredih po meri. Ker večina toString izvedbe zagotavljajo člane razreda v obliki zapisa String, String.valueOf (objekt) je naravno prileganje. Vsi predmeti Java, ki temeljijo na razredih, ki razširjajo Object, ponujajo a toString () izvedba, tudi če je preprosto njihova starša (ali celo Predmet(s) izvajanje toString (). Če pa članski razred implementira toString vendar je član sam ničen in ne primerek razreda, potem je toString () ne koristi (in dejansko vodi do NullPointerException ko je poklican).

To je prikazano z naslednjo kodo primera.

StringHandlingExample.java

paket prah v.primeri; import java.io.IOException; import java.io.OutputStream; uvoz java.util.logging.Logger; / ** * Primer razreda, ki prikazuje uporabo predstavitev niza, ki so na voljo prek implicitnih String, toString () in String.valueOf (). * / javni razred StringHandlingExample {zasebni statični končni niz NEW_LINE = System.getProperty ("line.separator"); / ** Uporaba java.util.logging. * / private static Logger LOGGER = Logger.getLogger (StringHandlingExample.class.getName ()); / ** * Glavna funkcija za izvajanje preizkusov / predstavitev. * * @param argumenti Argumenti ukazne vrstice; nihče ni pričakoval. * / javni statični void glavni (končni argumenti String []) {printHeader ("String predstavitev neposrednih nizov, System.out); končno PersonName personName = novo PersonName ("Flintstone", null); System.out.println ("Ime osebe [DIRECT]:" + personName); System.out.println ("Ime osebe [TOSTRING]:" + personName.toString ()); System.out.println ("Ime osebe [STRING.VALUEOF]:" + String.valueOf (personName)); printBlankLine (System.out); printHeader ("String predstavitev ne-null kompleksnega predmeta", System.out); končna oseba personOne = nova oseba (personName); System.out.println ("Person One [DIRECT]:" + personOne); System.out.println ("Person One [TOSTRING]:" + personOne.toString ()); System.out.println ("Oseba ena [STRING.VALUEOF]:" + String.valueOf (personOne)); printBlankLine (System.out); printHeader ("String prikaz ničelnega kompleksnega predmeta", System.out); končna oseba personTwo = nova oseba (null); System.out.println ("Oseba dva [NEPOSREDNO]:" + personTwo); System.out.println ("Oseba dva [TOSTRING]:" + personTwo.toString ()); System.out.println ("Oseba dva [STRING.VALUEOF]:" + String.valueOf (personTwo)); printBlankLine (System.out); } public static void printHeader (končno sporočilo niza, končni OutputStream out) {final String headerSeparator = "============================== ====================================== "; poskusite {out.write ((headerSeparator + NEW_LINE + sporočilo + NEW_LINE) .getBytes ()); out.write ((headerSeparator + NEW_LINE) .getBytes ()); } catch (IOException ioEx) {System.out.println (headerSeparator); System.out.println (sporočilo); System.out.println (headerSeparator); LOGGER.warning ("Informacije o glavi ni bilo mogoče zapisati v zagotovljeni OutputStream."); }} javna statična void printBlankLine (končni OutputStream out) {try {out.write (NEW_LINE.getBytes ()); } ulov (IOException ioEx) {System.out.println (NEW_LINE); LOGGER.warning ("Ne morem zapisati prazne vrstice v navedeni OutputStream."); }} / ** * Razred, po katerem želite poklicati toString. * / private static class PersonName {private String lastName; private String firstName; javno ime osebe (končni niz newLastName, končni niz newFirstName) {lastName = newLastName; firstName = newFirstName; } / ** * Navedite Stringovo predstavitev mene. * * @ vrni predstavitev mojega niza. * / @Override javni niz toString () {return firstName + "" + lastName; }} zasebni statični razred Oseba {ime zasebnega imena osebe; javna oseba (končno ime osebe novoime) {ime = novoime; } / ** * Navedite Stringovo predstavitev mene. * * @ vrni predstavitev mojega niza. * / public String toString () {// Ne uporabljaj - vodi do napake časa prevajalnika (nezdružljive vrste) // vrne ime; // Ne uporabljaj - lahko privede do napake med izvajanjem (NullPointerException) // vrne ime.toString (); // Vse je dobro return String.valueOf (name); }}} 

Zgornjo kodo lahko uporabimo za prikaz gradnje a toString metoda na kompleksnem objektu in kako se obnaša, ko ga pokliče lastniški razred. Najbolj zanimiva metoda je na dnu zgoraj prikazane kode. Zaradi povratnih težav sta dve vrednosti vrnjeni. Končni primer, z uporabo String.valueOf (objekt) se NE komentira, ker deluje najbolje vsakič, ko se zažene, ne glede na to, ali je kompleks kompleten Ime osebe objekt je ničen. Naslednje tri slike prikazujejo rezultate za vsako od teh predstavitev predstavitev niza predmetov osebe.

Vrednost niza iz zapletenega predmeta - napaka med prevajanjem

Vrednost niza iz zapletenega predmeta toString () - potencialno izvajanje NullPointerException

Vrednost niza iz zapletenega predmeta String.valueOf () - z nulami ravnamo graciozno

Uporaba String.valueOf (objekt) v toString () izvedbe so lahko še posebej koristne, ker pogosto uporabljamo toString () metoda pri odpravljanju napak in zadnja stvar, ki jo v takih primerih potrebujemo, je še ena izjema, do katere je prišlo med poskusom ogleda trenutnega stanja naših podatkov. Seveda se lahko tudi izvaja toString () metode z lastnimi čeki za nulo ali, še bolje, lahko uporabimo kaj podobnega ToStringBuilder. Vendar pa je na voljo String.valueOf (objekt) je vsekakor nekaj, kar je vredno upoštevati in je nekaj, kar se pogosto uporabljam. Mnogi od nas so ugotovili, da je manj vrstic kode na splošno bolj jasno in String.valueOf (objekt) je lahko veliko bolj jasen kot izrecno preverjanje predmeta za nulo, preden ga prikličete toString () izvajanje.

Končno, razred String ponuja veliko preobremenjenih metod valueOf. Poleg različice, ki je bila v središču te objave v spletnem dnevniku (sprejema predmet), druge preobremenjene različice valueOf sprejemajo primitivne tipe podatkov in polja primitivnih podatkovnih tipov.

Zaključek

Ne glede na to, kaj prinaša prihodnost v smislu izboljšanega ravnanja z ničelnimi vrednostmi v Javi, lahko danes uporabimo številne taktike za zmanjšanje neželenih (včasih jih resnično želimo!) Pojavov NullPointerException. Ena od teh je uporaba String.valueOf (objekt) kadar je to primerno.

Dodatni viri

  • String.valueOf ali Integer.toString ()?
  • Izrecno v primerjavi z implicitnim klicem toString
  • Vrednost niza z metodo String.valueOf ()
  • Pretvori številko v niz

To zgodbo "The Value of String.valueOf" je prvotno objavil JavaWorld.

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