Programovanie

Hodnota String.valueOf

Väčšina vývojárov v jazyku Java už pravdepodobne naplnila NullPointerException. Väčšina z nás sa naučila, ako je dôležité robiť určité veci, aby sme znížili svoje „príležitosti“ pri stretnutí s NullPointerException. V skutočnosti existuje stránka Wiki venovaná predchádzaniu alebo znižovaniu NullPointerExceptions.

Niekoľko ľudí argumentovalo za ďalšiu jazykovú podporu pre lepšie a ľahšie zvládnutie potenciálnej hodnoty null. Patria sem návrhy Java SE 7, Optimized Null Check a téza Kingy Dobolyi Changing Java’s Semantics for Handling Null Pointer Exceptions.

Medzi mnohými vecami, ktoré už môžeme urobiť pomerne ľahko, aby sme znížili počet stretnutí s NullPointerException, je ľahké urobiť jednu vec, ak je to vhodné, použiť String.valueOf (Object). The String.valueOf (objekt) metóda, ako uvádza jej dokumentácia generovaná Javadoc, vráti „null“, ak je odovzdaný objekt nulový a vráti výsledky odovzdaného Objektje toString () volanie, ak je vložené Objekt nie je null. Inými slovami, String.valueOf (String) kontroluje vás nulová hodnota.

Použitie String.valueOf (objekt) je obzvlášť užitočná pri implementácii natiahnuť metódy na vlastných triedach. Pretože väčšina natiahnuť implementácie poskytujú dátové členy triedy vo formáte String, String.valueOf (objekt) je prirodzený strih. Všetky objekty Java založené na triedach, ktoré rozširujú Object, poskytujú a natiahnuť() implementácia, aj keď je to jednoducho ich rodičov (alebo dokonca Objekts) implementácia natiahnuť(). Ak však trieda člena implementuje natiahnuť ale samotný člen je skôr nulový ako inštancia triedy, potom natiahnuť() nerobí dobre (a v skutočnosti vedie k a NullPointerException pri volaní).

To je demonštrované na nasledujúcom príklade kódu.

StringHandlingExample.java

balenie zásypu.príklady; import java.io.IOException; import java.io.OutputStream; import java.util.logging.Logger; / ** * Vzorová trieda demonštrujúca použitie reprezentácií reťazca dostupných prostredníctvom * implicitných reťazcov String, toString () a String.valueOf (). * / public class StringHandlingExample {private static final String NEW_LINE = System.getProperty ("line.separator"); / ** Používanie java.util.logging. * / private static Logger LOGGER = Logger.getLogger (StringHandlingExample.class.getName ()); / ** * Hlavná funkcia pre vykonávanie testov / ukážok. * * @param arguments Argumenty príkazového riadku; nikto nepredpokladal. * / public static void main (final argumenty String []) {printHeader ("Reťazcové zastúpenie priamych reťazcov", System.out); konečné meno osoby PersonName = nové meno osoby ("Flintstone", null); System.out.println ("Meno osoby [DIRECT]:" + meno osoby); System.out.println ("Meno osoby [TOSTRING]:" + meno osoby.toString ()); System.out.println ("Meno osoby [STRING.VALUEOF]:" + String.valueOf (meno osoby)); printBlankLine (System.out); printHeader ("Reťazcové znázornenie null komplexného objektu", System.out); konečná osoba personOne = nová osoba (personName); System.out.println ("Osoba jedna [PRIAME]:" + osobaOne); System.out.println ("Osoba jedna [TOSTRING]:" + osobaOne.toString ()); System.out.println ("Osoba jedna [STRING.VALUEOF]:" + String.valueOf (personOne)); printBlankLine (System.out); printHeader ("Reťazcové znázornenie nulového komplexného objektu", System.out); konečná osoba personTwo = nová osoba (null); System.out.println ("Osoba druhá [DIRECT]:" + osobaTwo); System.out.println ("Osoba druhá [TOSTRING]:" + personTwo.toString ()); System.out.println ("Osoba druhá [STRING.VALUEOF]:" + String.valueOf (personTwo)); printBlankLine (System.out); } public static void printHeader (konečná správa reťazca, výstupný výstupný výstup) {final String headerSeparator = "=============================== ====================================== "; skúsiť {out.write ((headerSeparator + NEW_LINE + správa + NEW_LINE) .getBytes ()); out.write ((headerSeparator + NEW_LINE) .getBytes ()); } chyta (IOException ioEx) {System.out.println (headerSeparator); System.out.println (správa); System.out.println (headerSeparator); LOGGER.warning ("Nepodarilo sa zapísať informácie o hlavičke do poskytnutého OutputStream."); }} public static void printBlankLine (final OutputStream out) {try {out.write (NEW_LINE.getBytes ()); } catch (IOException ioEx) {System.out.println (NEW_LINE); LOGGER.warning ("Nemohol zapísať prázdny riadok do poskytnutého OutputStream."); }} / ** * Trieda, podľa ktorej sa má volať na reťazec. * / private static class PersonName {private String lastName; private String meno; public PersonName (konečný reťazec newLastName, posledný reťazec newFirstName) {lastName = newLastName; firstName = newFirstName; } / ** * Poskytnite mi reťazcové zastúpenie. * * @return Reprezentácia môjho reťazca. * / @Override public String toString () {return firstName + "" + lastName; }} private static class Person {private PersonName name; verejná osoba (konečná PersonName newName) {name = newName; } / ** * Poskytnite mi reťazcové zastúpenie. * * @return Reprezentácia môjho reťazca. * / public String toString () {// Nepoužívať - ​​vedie k chybe času kompilátora (nekompatibilné typy) // návratové meno; // Nepoužívať - ​​môže viesť k chybe za behu (NullPointerException) // návrat name.toString (); // všetko je dobré návrat String.valueOf (name); }}} 

Vyššie uvedený kód môže byť použitý na demonštráciu stavby a natiahnuť metóda na zložitom objekte a ako sa správa, keď je volaná triedou, ktorá je vlastníkom. Najzaujímavejšia metóda je v dolnej časti kódu zobrazeného vyššie. Dve návratové hodnoty sú komentované kvôli problémom, ktoré sú s nimi spojené. Posledný príklad, použitie String.valueOf (objekt) nie je komentovaný, pretože funguje najlepšie pri každom spustení, či už je alebo nie je komplexný PersonName objekt je neplatný. Nasledujúce tri obrázky zobrazujú výstup pre každú z týchto prezentácií reťazcových reprezentácií objektov Person.

Reťazcová hodnota z komplexného objektu - chyba v čase kompilácie

Reťazcová hodnota zo zložitého objektu na toString () - potenciálna runtime výnimka NullPointerException

Reťazcová hodnota z komplexného objektu String.valueOf () - Null sa zaobchádza elegantne

Použitím String.valueOf (objekt) v natiahnuť() implementácie môžu byť obzvlášť prospešné, pretože často používame natiahnuť() metóda pri ladení a posledná vec, ktorú v týchto prípadoch potrebujeme, je ďalšia výnimka, ktorá sa vyskytla pri pokuse o zistenie aktuálneho stavu našich údajov. Samozrejme, dá sa aj implementovať natiahnuť() metódy s vlastnými kontrolami na hodnotu null alebo, ešte lepšie, je možné použiť niečo ako ToStringBuilder. Dostupnosť String.valueOf (objekt) určite stojí za to pamätať a je to vec, ktorú pomerne často používam. Mnohí z nás našli menej riadkov kódu, aby boli všeobecne jasnejšie a String.valueOf (objekt) môže byť oveľa jasnejšie ako explicitná kontrola objektu na hodnotu null pred vyvolaním jeho natiahnuť() implementácia.

Nakoniec trieda String poskytuje mnoho preťažených metód valueOf. Okrem verzie, na ktorú sa zameral tento blogový príspevok (prijíma objekt), prijímajú ďalšie preťažené verzie valueOf primitívne dátové typy a polia primitívnych dátových typov.

Záver

Bez ohľadu na to, čo budúcnosť prinesie v súvislosti so zlepšeným spracovaním hodnôt null v prostredí Java, existuje veľa taktík, ktoré dnes môžeme podniknúť, aby sme znížili počet nežiaducich (niekedy ich skutočne chceme vyhodiť!) Udalostí NullPointerException. Jedným z nich je použitie String.valueOf (objekt) ak je to vhodné.

Dodatočné zdroje

  • String.valueOf alebo Integer.toString ()?
  • Výslovné verzus implicitné volanie reťazca toString
  • Hodnota reťazca s metódou String.valueOf ()
  • Prevod čísla na reťazec

Tento príbeh „The Value of String.valueOf“ bol pôvodne publikovaný spoločnosťou JavaWorld.

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