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.
Note: Your post will require moderator approval before it will be visible.

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.



  • Posts

    • Welcome to my store :  https://topestore.mysellix.io/fr/ 2015-2022 Aged Discord Account 2015 Discord Account : 50.99 $ 2016 Discord Account : 10$ 2017 Discord Account :3.99 $ 2018 Discord Account : 3.50$ 2019 Discord Account : 2.70 $ 2020 Discord Account :1.50$ 2021 Discord Account :0.99$ 2022 Discord Account :0.70$ Warranty :Lifetime Payment Methods : Crypto/ PayPal Contact Me On Discord Or Telegram Discord : @ultrasstore11 Telegram : https://t.me/ultrastore1 Welcome to my store :  https://topestore.mysellix.io/fr/ 2015-2022 Aged Discord Account 2015 Discord Account : 50.99 $ 2016 Discord Account : 10$ 2017 Discord Account :3.99 $ 2018 Discord Account : 3.50$ 2019 Discord Account : 2.70 $ 2020 Discord Account :1.50$ 2021 Discord Account :0.99$ 2022 Discord Account :0.70$ Warranty :Lifetime Payment Methods : Crypto/ PayPal Contact Me On Discord Or Telegram Discord : @ultrasstore11
    • L2 ArenaWar: Low Rate PvP Server with Free Buffs & Autofarm [PVP]⚔️ [Free]🆓 Classic Interlude with  3x XP rates! Free starter pack(no grade) to kickstart your adventure! Autofarm for convenient grinding! Free buffs to keep you fighting fit! (2 job buffs) No experience loss on death! (Except with Karma) Clear Karma system to keep things fair! ⚖️ Active community of 800-1k players! Join our Discord to learn more! >> Discord <<     Server website: https://l2arenawar.com/en/    
    • This is dedication! 2 years working on a problem. Congratulations!
    • You indeed have to save player position over Enterworld to properly clean it up later (if you don't, even trying to delete packet content would eventually keep it up), that's what we do with debug packet (which is a reusable Map of ExServerPrimitive packets) on aCis.   It doesn't solve the FPS stuttering - more you draw/delete lines, more your client becomes laggy. It's like if client wasn't deleting drawn points/lines properly, but instead simply hide them and redrawn content above.   If you got a solution, I would happy to integrate it.   You should check aCis#Player _debug packet integration, it allows very big amount of lines/points to be drawn, it is also reusable.   https://gitlab.com/Tryskell/acis_public/-/blob/master/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/Player.java?ref_type=heads https://gitlab.com/Tryskell/acis_public/-/blob/master/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java?ref_type=heads  
    • we sell website templates, make websites to order. Great selection at very good prices. My contacts discord : advert1231 telegram : https://t.me/ggwpins  
  • Topics

×
×
  • Create New...