Programování

Hodnota String.valueOf

Většina vývojářů jazyka Java pravděpodobně naplnila NullPointerException. Většina z nás se naučila, jak je důležité dělat určité věci, abychom snížili naše „příležitosti“ setkat se s NullPointerException. Ve skutečnosti existuje stránka Wiki věnovaná prevenci nebo omezení NullPointerExceptions.

Několik lidí argumentovalo pro další jazykovou podporu pro lepší a snazší zacházení s potenciální nulou. Patří mezi ně návrhy Java SE 7, Optimized Null Check a práce Kingy Dobolyi Changing Java’s Semantics for Handling Null Pointer Exceptions.

Mezi mnoha věcmi, které již můžeme udělat poměrně snadno, abychom omezili naše setkání s NullPointerException, je jedna konkrétní snadná věc, kterou je třeba v případě potřeby použít String.valueOf (Object). The String.valueOf (objekt) metoda, jak uvádí její dokumentace generovaná Javadocem, vrací „null“, pokud je předaný objekt nula a vrátí výsledky předaného Objektje volání toString (), pokud je předáno Objekt není null. Jinými slovy, String.valueOf (String) kontroluje vás nulová.

Použití String.valueOf (objekt) je zvláště užitečné při provádění toString metody na vlastních třídách. Protože většina toString implementace poskytují datové členy třídy ve formátu String, String.valueOf (objekt) je přirozené. Všechny objekty Java založené na třídách, které rozšiřují Object, poskytují a toString () implementace, i když je to prostě jejich rodiče (nebo dokonce Objekt's) implementace toString (). Pokud však implementuje třídu člena toString ale samotný člen je spíše null než instance třídy, pak toString () nedělá nic dobrého (a ve skutečnosti vede k NullPointerException při volání).

To je ukázáno v následujícím příkladu kódu.

StringHandlingExample.java

příklady zásilky; import java.io.IOException; importovat java.io.OutputStream; import java.util.logging.Logger; / ** * Ukázková třída demonstrující použití String reprezentací dostupných prostřednictvím * implicitních String, toString () a String.valueOf (). * / public class StringHandlingExample {private static final String NEW_LINE = System.getProperty ("line.separator"); / ** Používání java.util.logging. * / private static Logger LOGGER = Logger.getLogger (StringHandlingExample.class.getName ()); / ** * Hlavní funkce pro provádění testů / demonstrací. * * @param arguments Argumenty příkazového řádku; nikdo nepředpokládal. * / public static void main (final String [] argumenty) {printHeader ("Řetězcové vyjádření přímých řetězců", System.out); final PersonName personName = new PersonName ("Flintstone", null); System.out.println ("Jméno osoby [PŘÍMÉ]:" + jméno osoby); System.out.println ("Jméno osoby [TOSTRING]:" + personName.toString ()); System.out.println ("Jméno osoby [STRING.VALUEOF]:" + String.valueOf (personName)); printBlankLine (System.out); printHeader ("Řetězcová reprezentace nenulového komplexního objektu", System.out); konečná osoba personOne = nová osoba (personName); System.out.println ("Osoba One [PŘÍMÝ]:" + personOne); System.out.println ("Osoba One [TOSTRING]:" + personOne.toString ()); System.out.println ("Osoba One [STRING.VALUEOF]:" + String.valueOf (personOne)); printBlankLine (System.out); printHeader ("Řetězcová reprezentace prázdného komplexního objektu", System.out); konečná osoba personTwo = nová osoba (null); System.out.println ("Osoba dvě [PŘÍMÉ]:" + osobaDva); System.out.println ("Osoba dvě [TOSTRING]:" + personTwo.toString ()); System.out.println ("Osoba dvě [STRING.VALUEOF]:" + String.valueOf (personTwo)); printBlankLine (System.out); } public static void printHeader (final String message, final OutputStream out) {final String headerSeparator = "================================ ====================================== "; try {out.write ((headerSeparator + NEW_LINE + message + NEW_LINE) .getBytes ()); out.write ((headerSeparator + NEW_LINE) .getBytes ()); } catch (IOException ioEx) {System.out.println (headerSeparator); System.out.println (zpráva); System.out.println (headerSeparator); LOGGER.warning ("Nelze zapsat informace záhlaví do poskytnutého OutputStream."); }} public static void printBlankLine (final OutStream out) {try {out.write (NEW_LINE.getBytes ()); } catch (IOException ioEx) {System.out.println (NEW_LINE); LOGGER.warning ("Nelze zapsat prázdný řádek na poskytnutý OutputStream."); }} / ** * Třída, na kterou se má volat na řetězec. * / soukromá statická třída PersonName {private String lastName; private String firstName; public PersonName (konečný řetězec newLastName, konečný řetězec newFirstName) {lastName = newLastName; firstName = newFirstName; } / ** * Poskytněte mi řetězcovou reprezentaci. * * @return My String zastoupení. * / @Override public String toString () {return firstName + "" + lastName; }} soukromá statická třída Osoba {private PersonName jméno; public Person (finální PersonName newName) {name = newName; } / ** * Poskytněte mi řetězcovou reprezentaci. * * @return My String zastoupení. * / public String toString () {// Nepoužívat - vede k časové chybě kompilátoru (nekompatibilní typy) // návratové jméno; // Nepoužívat - může vést k runtime chybě (NullPointerException) // návrat name.toString (); // Je to všechno dobrý návrat String.valueOf (name); }}} 

Výše uvedený kód lze použít k předvedení stavby a toString metoda na složitém objektu a jak se chová při volání třídou, která ji vlastní. Nejzajímavější metoda je ve spodní části výše uvedeného kódu. Dvě návratové hodnoty jsou komentovány kvůli problémům s nimi spojenými. Poslední příklad, použití String.valueOf (objekt) není komentován, protože funguje nejlépe pokaždé, když je spuštěn, ať už je komplex složitý nebo ne PersonName objekt je null. Další tři obrázky ukazují výstup pro každou z těchto prezentací řetězcových reprezentací objektů Person.

Řetězcová hodnota ze složitého objektu - chyba při kompilaci

Řetězcová hodnota ze složitého objektu toString () - Potenciální runtime NullPointerException

Řetězcová hodnota ze složitého objektu String.valueOf () - Nulls Gracefully

Použitím String.valueOf (objekt) v toString () implementace mohou být obzvláště výhodné, protože často používáme toString () metoda při ladění a poslední věc, kterou v takových případech potřebujeme, je další výjimka, která se vyskytla při pokusu o zobrazení aktuálního stavu našich dat. Samozřejmě lze také implementovat toString () metody s vlastní kontrolou null nebo, ještě lépe, lze použít něco jako ToStringBuilder. Dostupnost však String.valueOf (objekt) je určitě něco, co stojí za to mít na paměti a je to něco, co používám poměrně často. Mnozí z nás našli méně řádků kódu, aby byly obecně jasnější a String.valueOf (objekt) může být mnohem jasnější než explicitní kontrola objektu na hodnotu null před vyvoláním jeho toString () implementace.

Nakonec třída String poskytuje mnoho přetížených metod valueOf. Kromě verze, na kterou se zaměřil tento příspěvek na blogu (přijímá Object), přijímají ostatní přetížené verze valueOf primitivní datové typy a pole primitivních datových typů.

Závěr

Bez ohledu na to, co budoucnost přinese, pokud jde o vylepšenou manipulaci s hodnotou null v Javě, existuje dnes mnoho taktik, kterými můžeme omezit nežádoucí (někdy je ve skutečnosti chceme, aby byly vyvolány!) Výskyty NullPointerException. Jedním z nich je použití String.valueOf (objekt) pokud je to vhodné.

Dodatečné zdroje

  • String.valueOf nebo Integer.toString ()?
  • Explicitní versus implicitní volání toString
  • Hodnota řetězce s metodou String.valueOf ()
  • Převést číslo na řetězec

Tento příběh „The Value of String.valueOf“ byl původně publikován společností JavaWorld.