Xanderॐ Posted February 7, 2012 Share Posted February 7, 2012 Όσοι ασχολείστε με L2J σίγουρα θα έχετε δει την παρακάτω πρόταση: L2PcInstance target = activeChar.getTarget(); Κάποιοι έχουν ίσως δει και μια παραλλαγή της: final L2PcInstance target = activeChar.getTarget(); Η μόνη διαφορά είναι η λέξη final στην αρχή της πρώτης πρότασης. Η λέξη final το μόνο που κάνει άμεσα είναι να μην επιτρέψει την αλλαγή μιας μεταβλητής μετά την πρώτη της ανάθεση. Δηλαδή από τη στιγμή που η μεταβλητή target πήρε τιμή, η τιμή αυτή δεν θα αλλάξει. Για παράδειγμα το παρακάτω θα δώσει error κατά τη διάρκεια του compile : L2PcInstance target = activeChar.getTarget(); L2PcInstance target = null; <--- Error: the final variable cannot be reassigned. Οι λόγοι που χρησιμοποιούμε final : 1)Θέλουμε να δώσουμε τιμές σε μεταβλητές που δεν μπορεί να αλλάξει κανείς άλλος ώστε να μη προκαλέσει προβλήματα στον κώδικα από ελλειπή γνώση. 2)Θέλουμε να αυξήσουμε την απόδοση του κώδικα. Όταν ο compiler δει την λέξη final εκτός μιας συνάρτησης βρίσκει όλα τα μέρη στα οποία υπάρχει η μεταβλητή και την αντικαθιστά με την τιμή της. Για παράδειγμα Κώδικας: final int x = 10; System.out.println(x); Μετά το Compile : final int x = 10;; System.out.println(10); Αυτό που έκανε ο compiler για εμάς είναι να βάλει όπου βρει το x την τιμή 10 μιας που η μεταβλητή δεν γίνεται να αλλάξει. Αυτό που κερδίζουμε είναι ότι όταν φτάσει η εκτέλεση στη γραμμή Sustem.out.println... δεν θα ψάξει να βρει στη μνήμη τη μεταβλητή x καθώς την έχει αντικαταστήσει, κάνοντας έτσι τον κώδικα πιο γρήγορο. 3)Κάνουμε τον κώδικα ακόμα πιο γρήγορο και μικρότερο ταυτόχρονα. Ας δούμε το παρακάτω παράδειγμα: public boolean log = false; if(x){ Do logging bla bla ... } Κάθε φορά που τρέχει ο παραπάνω κώδικας ελέγχεται η τιμή του χ και αν είναι false δεν προχωράει μέσα στις αγκύλες. Ο έλεγχος όμως γίνεται κάθε φορά καθώς το x μπορεί να αλλάξει και ταυτόχρονα ο κώδικας μέσα στις αγκύλες παραμένει. Αν όμως γράψουμε τον κώδικα ως εξής : final boolean x = false; if(x) { Do logging } Η τιμή του x δεν μπορεί να αλλάξει γιατί είναι final. Ο Compiler όταν το δει αυτό θα καταλάβει ότι η εκτέλεση δεν θα φτάσει ποτέ μέσα στις αγκύλες οπότε διαγράφει από το class/jar όλο το τμήμα if ().... με αποτέλεσμα να μη χρειαστεί να κάνει ποτέ τη σύγκριση κάνοντας τον κώδικα πιο γρήγορο. Ταυτόχρονα επειδή διαγράφει το τμήμα του κώδικα το παραγόμενο class/jar είναι μικρότερο. 4)Η λέξη final μέσα σε μια συνάρτηση δεν αυξάνει την απόδοση τόσο όσο αναφέρθηκε προηγουμένως καθώς η τιμή της ορίζετε κάθε φορά που εκτελείται η συνάρτηση. void foo() { final L2PcInstance target = getTarget(); bla bla ... } foo(); <-- Δίνει τιμή στην final foo(); <-- Ξαναδίνει τιμή στην final foo(); <-- Ξαναδίνει τιμή στην final 5)Η λέξη final αναφέρεται στην αναφορά προς ένα αντικείμενο και όχι προς το αντικείμενο αυτό για παράδειγμα : final L2PcInstance target = getTarget(); target.sendMessage("BlaBla"); <-- True, μπορεί να γίνει, δεν το εμποδίζει η final. Τα 1,2,4,5 είναι βασικά πράγματα, το 3 είναι magic ;) Αυτά :) Quote Link to comment Share on other sites More sharing options...
AbsolutePower Posted February 7, 2012 Share Posted February 7, 2012 Όσοι ασχολείστε με L2J σίγουρα θα έχετε δει την παρακάτω πρόταση: L2PcInstance target = activeChar.getTarget(); Κάποιοι έχουν ίσως δει και μια παραλλαγή της: final L2PcInstance target = activeChar.getTarget(); Η μόνη διαφορά είναι η λέξη final στην αρχή της πρώτης πρότασης. Η λέξη final το μόνο που κάνει άμεσα είναι να μην επιτρέψει την αλλαγή μιας μεταβλητής μετά την πρώτη της ανάθεση. Δηλαδή από τη στιγμή που η μεταβλητή target πήρε τιμή, η τιμή αυτή δεν θα αλλάξει. Για παράδειγμα το παρακάτω θα δώσει error κατά τη διάρκεια του compile : L2PcInstance target = activeChar.getTarget(); L2PcInstance target = null; <--- Error: the final variable cannot be reassigned. Οι λόγοι που χρησιμοποιούμε final : 1)Θέλουμε να δώσουμε τιμές σε μεταβλητές που δεν μπορεί να αλλάξει κανείς άλλος ώστε να μη προκαλέσει προβλήματα στον κώδικα από ελλειπή γνώση. 2)Θέλουμε να αυξήσουμε την απόδοση του κώδικα. Όταν ο compiler δει την λέξη final εκτός μιας συνάρτησης βρίσκει όλα τα μέρη στα οποία υπάρχει η μεταβλητή και την αντικαθιστά με την τιμή της. Για παράδειγμα Κώδικας: final int x = 10; System.out.println(x); Μετά το Compile : final int x = 10;; System.out.println(10); Αυτό που έκανε ο compiler για εμάς είναι να βάλει όπου βρει το x την τιμή 10 μιας που η μεταβλητή δεν γίνεται να αλλάξει. Αυτό που κερδίζουμε είναι ότι όταν φτάσει η εκτέλεση στη γραμμή Sustem.out.println... δεν θα ψάξει να βρει στη μνήμη τη μεταβλητή x καθώς την έχει αντικαταστήσει, κάνοντας έτσι τον κώδικα πιο γρήγορο. 3)Κάνουμε τον κώδικα ακόμα πιο γρήγορο και μικρότερο ταυτόχρονα. Ας δούμε το παρακάτω παράδειγμα: public boolean log = false; if(x){ Do logging bla bla ... } Κάθε φορά που τρέχει ο παραπάνω κώδικας ελέγχεται η τιμή του χ και αν είναι false δεν προχωράει μέσα στις αγκύλες. Ο έλεγχος όμως γίνεται κάθε φορά καθώς το x μπορεί να αλλάξει και ταυτόχρονα ο κώδικας μέσα στις αγκύλες παραμένει. Αν όμως γράψουμε τον κώδικα ως εξής : final boolean x = false; if(x) { Do logging } Η τιμή του x δεν μπορεί να αλλάξει γιατί είναι final. Ο Compiler όταν το δει αυτό θα καταλάβει ότι η εκτέλεση δεν θα φτάσει ποτέ μέσα στις αγκύλες οπότε διαγράφει από το class/jar όλο το τμήμα if ().... με αποτέλεσμα να μη χρειαστεί να κάνει ποτέ τη σύγκριση κάνοντας τον κώδικα πιο γρήγορο. Ταυτόχρονα επειδή διαγράφει το τμήμα του κώδικα το παραγόμενο class/jar είναι μικρότερο. 4)Η λέξη final μέσα σε μια συνάρτηση δεν αυξάνει την απόδοση τόσο όσο αναφέρθηκε προηγουμένως καθώς η τιμή της ορίζετε κάθε φορά που εκτελείται η συνάρτηση. void foo() { final L2PcInstance target = getTarget(); bla bla ... } foo(); <-- Δίνει τιμή στην final foo(); <-- Ξαναδίνει τιμή στην final foo(); <-- Ξαναδίνει τιμή στην final 5)Η λέξη final αναφέρεται στην αναφορά προς ένα αντικείμενο και όχι προς το αντικείμενο αυτό για παράδειγμα : final L2PcInstance target = getTarget(); target.sendMessage("BlaBla"); <-- True, μπορεί να γίνει, δεν το εμποδίζει η final. Τα 1,2,4,5 είναι βασικά πράγματα, το 3 είναι magic ;) Αυτά :) wraios man xrisimo gia tous newbie :) an kai i le3h to leei apo monh ths final = teliko :P Quote Link to comment Share on other sites More sharing options...
Xanderॐ Posted February 7, 2012 Author Share Posted February 7, 2012 Δεν είναι για newbies, ξαναδιάβασε :) Quote Link to comment Share on other sites More sharing options...
AbsolutePower Posted February 7, 2012 Share Posted February 7, 2012 Δεν είναι για newbies, ξαναδιάβασε :) Να σου πω την αλήθεια δεν το διάβασα απλά ειδα τον τίτλο "Final" και έγραψα... :P Quote Link to comment Share on other sites More sharing options...
Xanderॐ Posted February 7, 2012 Author Share Posted February 7, 2012 Να σου πω την αλήθεια δεν το διάβασα απλά ειδα τον τίτλο "Final" και έγραψα... :P Καλά το κατάλαβα -.-'. Αν θες να μάθεις να κάνεις μαγικά, διάβασε το 3 μόνο. Εκεί είναι όλο το ζουμί. Quote Link to comment Share on other sites More sharing options...
FighterBoss Posted February 7, 2012 Share Posted February 7, 2012 με αποτέλεσμα να μη χρειαστεί να κάνει ποτέ τη σύγκριση κάνοντας τον κώδικα πιο γρήγορο. Ταυτόχρονα επειδή διαγράφει το τμήμα του κώδικα το παραγόμενο class/jar είναι μικρότερο. Αυτό ήταν πραγματικά ενδιαφέρον! Quote Link to comment Share on other sites More sharing options...
UnixCode Posted February 8, 2012 Share Posted February 8, 2012 Ωραίο το guide σου το διάβασα ολόκληρο , ελπίζω να δούμε τέτοια παρόμοια guides java από εσένα. Quote Link to comment Share on other sites More sharing options...
Grim. Posted February 8, 2012 Share Posted February 8, 2012 Χρήσιμο Guide μιας και τα Greek Section είναι half-dead Quote Link to comment Share on other sites More sharing options...
Xanderॐ Posted February 8, 2012 Author Share Posted February 8, 2012 Greeks > All ;) Quote Link to comment Share on other sites More sharing options...
pirama Posted February 9, 2012 Share Posted February 9, 2012 poli wraios (an kai Newbies kati piasame kai apo edw) fasoyli to fasoyli gemizi to sakoyli :) Eyxaristw.... Quote Link to comment Share on other sites More sharing options...
Dev Posted February 10, 2012 Share Posted February 10, 2012 Μην του χαλάτε το τόπικ με τα γκρίκλις σας. Leluche, είσαι ωραίος. Quote Link to comment Share on other sites More sharing options...
Sponz Posted February 12, 2012 Share Posted February 12, 2012 public boolean log = false; if(x){ Do logging bla bla ... } mallon ekei pou les log enoouses x... oreo to guide :) Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.