Προγραμματισμός

Η αξία του String.valueOf

Οι περισσότεροι προγραμματιστές Java είχαν πιθανότατα το NullPointerException. Οι περισσότεροι από εμάς έχουμε μάθει την αξία να κάνουμε ορισμένα πράγματα για να μειώσουμε τις "ευκαιρίες" μας να συναντήσουμε το NullPointerException. Πράγματι, υπάρχει μια σελίδα Wiki αφιερωμένη στην πρόληψη ή τη μείωση των NullPointerExceptions.

Αρκετά άτομα υποστήριξαν για πρόσθετη γλωσσική υποστήριξη για βελτιωμένο και ευκολότερο χειρισμό πιθανών μηδενικών. Αυτές περιλαμβάνουν προτάσεις Java SE 7, Optimized Null Check και διατριβή της Kinga Dobolyi "Αλλαγή της σημασίας της Java για τον χειρισμό εξαιρέσεων Null Pointer".

Μεταξύ των πολλών πραγμάτων που μπορούμε ήδη να κάνουμε μάλλον εύκολα για να μειώσουμε τις συναντήσεις μας με το NullPointerException, ένα ιδιαίτερο εύκολο πράγμα που πρέπει να κάνουμε είναι να εφαρμόσουμε το String.valueOf (Object) όταν χρειάζεται. ο String.valueOf (Αντικείμενο) μέθοδος, όπως δηλώνει η τεκμηρίωση που δημιουργείται από το Javadoc, επιστρέφει "null" εάν το αντικείμενο που έχει περάσει είναι μηδενικό και επιστρέφει τα αποτελέσματα στο πέρασμα ΑντικείμενοΚλήση toString () εάν το πέρασμα Αντικείμενο δεν είναι μηδενικό. Με άλλα λόγια, String.valueOf (Συμβολοσειρά) κάνει το μηδέν έλεγχο για εσάς.

Η χρήση του String.valueOf (Αντικείμενο) είναι ιδιαίτερα χρήσιμο κατά την εφαρμογή toString μεθόδους σε προσαρμοσμένες τάξεις. Επειδή τα περισσότερα toString οι υλοποιήσεις παρέχουν τα μέλη δεδομένων της κλάσης σε μορφή String, String.valueOf (Αντικείμενο) είναι φυσική εφαρμογή. Όλα τα αντικείμενα Java που βασίζονται σε κλάσεις που επεκτείνουν το Object παρέχουν ένα toString () υλοποίηση ακόμη και αν είναι απλώς του γονέα τους (ή ακόμα και Αντικείμενοεφαρμογή του toString (). Ωστόσο, εάν μια τάξη μέλους εφαρμόζει toString αλλά το ίδιο το μέλος είναι μηδενικό παρά μια παρουσία της τάξης, τότε το toString () δεν κάνει καλό (και οδηγεί πραγματικά σε ένα NullPointerException όταν καλείται).

Αυτό αποδεικνύεται με τον ακόλουθο κωδικό κώδικα.

StringHandlingExample.java

πακέτο dustin.example; εισαγωγή java.io.IOException; εισαγωγή java.io.OutputStream; εισαγωγή java.util.logging.Logger; / ** * Παράδειγμα κλάσης που δείχνει τη χρήση παραστάσεων String διαθέσιμων μέσω * implicit String, toString () και String.valueOf (). * / δημόσια τάξη StringHandlingExample {private static final String NEW_LINE = System.getProperty ("line.separator"); / ** Χρήση του java.util.logging. * / ιδιωτικό στατικό Logger LOGGER = Logger.getLogger (StringHandlingExample.class.getName ()); / ** * Κύρια λειτουργία για εκτέλεση δοκιμών / επιδείξεων. * * Ορίσματα @param Ορίσματα γραμμής εντολών. κανένα αναμενόμενο. * / public static void main (final επιχειρήματα String []) {printHeader ("Αναπαράσταση συμβολοσειράς άμεσων συμβολοσειρών", System.out); τελικό PersonName personName = νέο PersonName ("Flintstone", null); System.out.println ("Όνομα ατόμου [DIRECT]:" + personName); System.out.println ("Όνομα ατόμου [TOSTRING]:" + personName.toString ()); System.out.println ("Όνομα ατόμου [STRING.VALUEOF]:" + String.valueOf (personName)); printBlankLine (System.out); printHeader ("Αναπαράσταση συμβολοσειράς μη σύνθετου αντικειμένου", System.out); final Person personOne = νέο πρόσωπο (personName); System.out.println ("Person One [DIRECT]:" + personOne); System.out.println ("Person One [TOSTRING]:" + personOne.toString ()); System.out.println ("Person One [STRING.VALUEOF]:" + String.valueOf (personOne)); printBlankLine (System.out); printHeader ("Αναπαράσταση συμβολοσειράς μηδενικού σύνθετου αντικειμένου", System.out); final Person personTwo = νέο άτομο (μηδέν); System.out.println ("Άτομο δύο [ΑΜΕΣΗ]:" + personTwo); System.out.println ("Person Two [TOSTRING]:" + personTwo.toString ()); System.out.println ("Person Two [STRING.VALUEOF]:" + String.valueOf (personTwo)); printBlankLine (System.out); } public static void printHeader (τελικό μήνυμα String, final OutputStream out) {final String headerSeparator = "============================== ====================================== "; δοκιμάστε το {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 (μήνυμα); System.out.println (headerSeparator); LOGGER.warning ("Δεν ήταν δυνατή η εγγραφή πληροφοριών κεφαλίδας στο παρεχόμενο OutputStream."); }} public static void printBlankLine (final OutputStream out) {δοκιμάστε {out.write (NEW_LINE.getBytes ()); } catch (IOException ioEx) {System.out.println (NEW_LINE); LOGGER.warning ("Δεν ήταν δυνατή η εγγραφή κενής γραμμής στο παρεχόμενο OutputStream."); }} / ** * Τάξη στην οποία πρέπει να καλέσετε στο String. * / private static class PersonName {private String lastName; ιδιωτικό όνομα συμβολοσειράς; δημόσιο PersonName (final String newLastName, final String newFirstName) {lastName = newLastName; firstName = newFirstName; } / ** * Δώστε εκπροσώπηση συμβολοσειράς για εμένα. * * @return Αναπαράσταση My String. * / @ Override public String toString () {return firstName + "" + lastName; }} ιδιωτικό στατικό μάθημα κατηγορίας {ιδιωτικό όνομα προσώπου; δημόσιο πρόσωπο (τελικό όνομαName newName) {name = newName; } / ** * Δώστε εκπροσώπηση συμβολοσειράς για εμένα. * * @return Αναπαράσταση My String. * / public String toString () {// Don't use - οδηγεί σε σφάλμα χρόνου μεταγλωττιστή (μη συμβατοί τύποι) // όνομα επιστροφής; // Μην χρησιμοποιείτε - μπορεί να οδηγήσει σε σφάλμα χρόνου εκτέλεσης (NullPointerException) // return name.toString (); // Είναι όλα καλή επιστροφή String.valueOf (όνομα); }}} 

Ο παραπάνω κώδικας μπορεί να χρησιμοποιηθεί για να δείξει την κατασκευή ενός toString μέθοδο σε ένα σύνθετο αντικείμενο και πώς συμπεριφέρεται όταν καλείται από μια ιδιοκτήτρια τάξη. Η μέθοδος με το μεγαλύτερο ενδιαφέρον βρίσκεται στο κάτω μέρος του κώδικα που φαίνεται παραπάνω. Σχολιάζονται δύο τιμές επιστροφής λόγω προβλημάτων που σχετίζονται με αυτές. Το τελικό παράδειγμα, χρησιμοποιώντας String.valueOf (Αντικείμενο) ΔΕΝ σχολιάζεται γιατί λειτουργεί καλύτερα κάθε φορά που εκτελείται είτε το συγκρότημα είτε όχι Όνομα προσώπου το αντικείμενο είναι μηδέν. Οι επόμενες τρεις εικόνες δείχνουν την έξοδο για καθεμία από αυτές τις παρουσιάσεις των αναπαραστάσεων συμβολοσειρών αντικειμένων του ατόμου.

Τιμή συμβολοσειράς από σύνθετο αντικείμενο - Σφάλμα χρόνου μεταγλώττισης

Τιμή συμβολοσειράς από σύνθετο αντικείμενο σε συμβολοσειρά () - Πιθανός χρόνος εκτέλεσης NullPointerException

Τιμή συμβολοσειράς από σύνθετο αντικείμενο String.valueOf () - Nulls που χειρίζονται χαριτωμένα

Χρησιμοποιώντας String.valueOf (Αντικείμενο) σε toString () Οι υλοποιήσεις μπορεί να είναι ιδιαίτερα επωφελείς επειδή συχνά χρησιμοποιούμε το toString () μέθοδος κατά τον εντοπισμό σφαλμάτων και το τελευταίο πράγμα που χρειαζόμαστε σε τέτοιες περιπτώσεις είναι μια άλλη εξαίρεση που αντιμετωπίστηκε κατά την προσπάθεια να δείτε την τρέχουσα κατάσταση των δεδομένων μας. Φυσικά, μπορεί επίσης να εφαρμοστεί toString () μεθόδους με δικούς σας ελέγχους για μηδενική ή, ακόμη καλύτερα, μπορεί κανείς να χρησιμοποιήσει κάτι σαν το ToStringBuilder. Ωστόσο, η διαθεσιμότητα του String.valueOf (Αντικείμενο) είναι σίγουρα κάτι που αξίζει να θυμάστε και είναι κάτι που χρησιμοποιώ αρκετά συχνά. Πολλοί από εμάς έχουν βρει λιγότερες γραμμές κώδικα για να είναι γενικά πιο σαφείς και String.valueOf (Αντικείμενο) μπορεί να είναι πολύ πιο ξεκάθαρο από τον σαφή έλεγχο ενός αντικειμένου για μηδενικό πριν από την επίκλησή του toString () εκτέλεση.

Τέλος, η κλάση String παρέχει πολλές υπερφορτωμένες μεθόδους ValueOf. Εκτός από την έκδοση που ήταν το επίκεντρο αυτής της ανάρτησης ιστολογίου (δέχεται ένα αντικείμενο), οι άλλες υπερφορτωμένες εκδόσεις του ValueOf αποδέχονται πρωτόγονους τύπους δεδομένων και πίνακες πρωτόγονων τύπων δεδομένων.

συμπέρασμα

Ανεξάρτητα από το τι φέρνει το μέλλον όσον αφορά τον βελτιωμένο μηδενικό χειρισμό στην Java, υπάρχουν πολλές τακτικές που μπορούμε να ακολουθήσουμε σήμερα για να μειώσουμε τις ανεπιθύμητες (μερικές φορές πραγματικά θέλουμε να ρίχνονται!) Τις εμφανίσεις του NullPointerException. Ένα από αυτά είναι η χρήση String.valueOf (Αντικείμενο) όταν αρμόζει.

Επιπρόσθετοι πόροι

  • String.valueOf ή Integer.toString ();
  • Άμεση έναντι έμμεσης κλήσης του toString
  • Η τιμή μιας συμβολοσειράς με τη μέθοδο String.valueOf ()
  • Μετατροπή αριθμού σε συμβολοσειρά

Αυτή η ιστορία, "Η αξία του String.valueOf" δημοσιεύθηκε αρχικά από το JavaWorld.

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