Jump to content

[Guide][Advanced java]Μαγικά με τη δεσμευμένη λέξη final στο L2J


Recommended Posts

Όσοι ασχολείστε με 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 ;)

 

Αυτά :)

Link to comment
Share on other sites

Όσοι ασχολείστε με 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
Link to comment
Share on other sites

Δεν είναι για newbies, ξαναδιάβασε :)

Να σου πω την αλήθεια δεν το διάβασα απλά ειδα τον τίτλο  "Final" και έγραψα... :P
Link to comment
Share on other sites

Να σου πω την αλήθεια δεν το διάβασα απλά ειδα τον τίτλο  "Final" και έγραψα... :P

 

Καλά το κατάλαβα -.-'. Αν θες να μάθεις να κάνεις μαγικά, διάβασε το 3 μόνο. Εκεί είναι όλο το ζουμί.

Link to comment
Share on other sites

με αποτέλεσμα να μη χρειαστεί να κάνει ποτέ τη σύγκριση κάνοντας τον κώδικα πιο γρήγορο. Ταυτόχρονα επειδή διαγράφει το τμήμα του κώδικα το παραγόμενο class/jar είναι μικρότερο.

 

Αυτό ήταν πραγματικά ενδιαφέρον!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...