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

Ιδιωτικός και τελικός;

Ε: Δεδομένου ότι:

  • ιδιωτικός Οι μέθοδοι δεν μπορούν να παρακαμφθούν από υποκατηγορίες
  • τελικός Οι μέθοδοι δεν μπορούν να παρακαμφθούν από υποκατηγορίες
  • τελικός Οι μέθοδοι επιτρέπουν ταχύτερο κώδικα όταν μεταγλωττίζονται με βελτιστοποιήσεις (javac -O)

Οι ερωτήσεις μου είναι:

  1. Γιατί να μην δηλώσετε όλα ιδιωτικός μεθόδους τελικός επισης?
  2. Αντιμετωπίζετε τα περισσότερα μεταγλωττιστικά ιδιωτικός μεθόδους ως τελικός?

ΕΝΑ: Όπως επισημαίνετε, οι υποκατηγορίες ενδέχεται να μην παρακάμπτουν ιδιωτικός μεθόδους από το σχεδιασμό. Επιπλέον, το τελικός Η λέξη-κλειδί λέει στον μεταγλωττιστή ότι οι υποκατηγορίες ενδέχεται να μην παρακάμψουν μια μέθοδο ανεξάρτητα από το επίπεδο πρόσβασης. Από ιδιωτικός ήδη υπονοεί ότι μια υποκατηγορία ενδέχεται να μην παρακάμψει μια μέθοδο, δηλώνοντας a ιδιωτικός μέθοδος για να είναι τελικός είναι περιττό. Η υποβολή της δήλωσης δεν θα προκαλέσει προβλήματα, αλλά δεν θα ολοκληρώσει τίποτα από τότε ιδιωτικόςθεωρούνται αυτόματα τελικός.

Λοιπόν, η πρακτική της δήλωσης όλων ιδιωτικός μεθόδους τελικός θα έχει μία παρενέργεια. Κάθε αρχάριος προγραμματιστής Java που συναντά τον κωδικό σας θα εξομοιώσει τη χρήση του ιδιωτικός τελικός, το σκέφτομαι ιδιωτικόςΠρέπει να δηλωθούν με αυτόν τον τρόπο. Έτσι, θα μπορείτε να κρίνετε ποιος έχει και ποιος δεν έχει έρθει σε επαφή με τον κωδικό σας. Μπορεί να αποδειχθεί μια ενδιαφέρουσα άσκηση.

Επομένως, για να απαντήσετε στην ερώτηση 1, δεν χρειάζεται να δηλώσετε ιδιωτικός μέλη τελικός.

Όσον αφορά την ερώτηση 2, ένας βελτιστοποιητής μεταγλωττιστή και JVM μπορούν να επωφεληθούν ιδιωτικός μεθόδους και τελικός μεθόδους. Επειδή οι υποκατηγορίες ενδέχεται να μην παρακάμπτουν αυτούς τους τύπους, δεν χρειάζεται να κάνετε δυναμική δέσμευση κατά το χρόνο εκτέλεσης. Οι υποκατηγορίες δεν θα παρακάμψουν ποτέ τη μέθοδο, οπότε ο χρόνος εκτέλεσης θα ξέρει πάντα ποια μέθοδο να καλεί χωρίς αναζήτηση της ιεραρχίας κληρονομιάς. Κατά τη διάρκεια της σύνταξης ένας βελτιστοποιητής μεταγλωττιστής μπορεί ακόμη και να επιλέξει να ενσωματώσει όλα ιδιωτικός και τελικός μεθόδους για τη βελτίωση της απόδοσης.

Έτσι, για να απαντήσετε στην ερώτηση 2, ναι, όλοι οι μεταγλωττιστές θα αντιμετωπίσουν ιδιωτικός μεθόδους ως τελικός. Ο μεταγλωττιστής δεν θα επιτρέψει κανένα ιδιωτικός μέθοδος για παράκαμψη. Ομοίως, όλοι οι μεταγλωττιστές θα αποτρέψουν την παράκαμψη των υποκατηγοριών τελικός μεθόδους.

Μια πιο ενδιαφέρουσα ερώτηση: Θα βελτιστοποιηθούν όλοι οι μεταγλωττιστές τελικόςs και ιδιωτικόςέτσι ώστε να είναι inline; Η σύντομη απάντηση είναι όχι. Η συμπεριφορά βελτιστοποίησης θα εξαρτηθεί από τον μεταγλωττιστή και τις ρυθμίσεις του.

Σημείωση: Η συζήτησή μας για το ιδιωτικό τελικό ισχύει μόνο για μεθόδους. Οι μεταβλητές του ιδιωτικού τελικού μέλους αντιμετωπίζονται διαφορετικά

Μάθετε περισσότερα σχετικά με αυτό το θέμα

  • Θέλουν περισσότερα? Δείτε το Ε & Α Java Ευρετήριο για τον πλήρη κατάλογο ερωτήσεων και απαντήσεων

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

Αυτή η ιστορία, "Ιδιωτική και τελική;" δημοσιεύθηκε αρχικά από το JavaWorld.