Τι νέο υπάρχει στην Java 17;

Η έκδοση Long-Term-Support (LTS) της πλατφόρμας Java 17 της γλώσσας και χρόνου εκτέλεσης Java κυκλοφόρησε στις 14 Σεπτεμβρίου 2021. Ας μάθουμε τι νέο υπάρχει στην Java 17 και αν πρέπει να αναβαθμίσετε.

Πολλές εφαρμογές χρησιμοποιούν παλαιότερες εκδόσεις Java, συμπεριλαμβανομένων των προηγούμενων εκδόσεων LTS της Java: Java 11 και Java 8.

Γιατί πρέπει οι επιχειρήσεις να κάνουν αναβάθμιση στην πιο πρόσφατη έκδοση Java; Η αναβάθμιση σε Java 17 απαιτεί προσπάθεια, κυρίως για να αξιοποιηθούν στο έπακρο οι νέες δυνατότητες και λειτουργίες του JVM.

Πολλές επιχειρήσεις χρησιμοποιούν εικόνες Docker και Docker για να μεταβούν εύκολα σε Java 17 με ελάχιστο κόπο και χρόνο. Οι προγραμματιστές μπορούν να ορίσουν τους αγωγούς συνεχούς ενοποίησης/ανάπτυξης (CI/CD) και να εκτελέσουν τα πάντα στις εικόνες Docker. Αυτό δεν θα επηρεάσει άλλες ομάδες που χρησιμοποιούν παλαιότερες εκδόσεις Java, καθώς μπορούν να χρησιμοποιήσουν παλιές εικόνες Docker.

JAVA 17 Χαρακτηριστικά

Υποστήριξη macOS και AArch64

Ένα από τα κρίσιμα χαρακτηριστικά του JVM που προστέθηκαν σε αυτήν την έκδοση είναι η ενίσχυση της υποστήριξης για macOS στην αρχιτεκτονική AArch64 χρησιμοποιώντας το JEP 391. Θα υποστηρίζει την τελευταία σειρά επεξεργαστών (M1) που κυκλοφόρησε η Apple με τους υπολογιστές της τον τελευταίο χρόνο.

Δεν είναι απαραίτητα μεγάλη υπόθεση για τους χρήστες σε αυτές τις πλατφόρμες, καθώς ορισμένοι προμηθευτές έχουν κυκλοφορήσει εκδόσεις του JDK που υποστηρίζουν αυτήν την αρχιτεκτονική και επιστρέφουν υποστήριξη από την Java 8. Ωστόσο, η επίσημη σφραγίδα έγκρισης είναι απαραίτητη για τη διασφάλιση της μελλοντικής συντήρησης και υποστήριξης του η πλατφόρμα. Συγκριτικά, η υποστήριξη για την πλατφόρμα Linux/AArch64 έχει προστεθεί στην Java 9 και στα Windows/AArch64 στην Java 16.

Σφραγισμένες τάξεις

Το Sealed Classes είναι μια δυνατότητα που εισήχθη στην Java 17. Η λειτουργία Sealed Classes ολοκλήρωσε τη δοκιμαστική της φάση και έχει γίνει επίσημη πλατφόρμα και γλώσσα στην Java 17. Επιτρέπει σε έναν προγραμματιστή να καθορίσει τους επιτρεπόμενους δευτερεύοντες τύπους που μπορεί να έχει ένας τύπος και αποτρέπει άλλους από το να το επεκτείνουν ή να το εφαρμόσουν με τρόπο που δεν επιδιώκεται.

Οι κλάσεις σφραγισμένες επιτρέπουν επίσης στον μεταγλωττιστή να δημιουργεί σφάλματα κατά το χρόνο μεταγλώττισης όταν προσπαθείτε να μετατρέψετε έναν μη σφραγισμένο τύπο σε μη επιτρεπόμενο υποτύπο. Η Java 17 φέρνει επίσης μια νέα διοχέτευση απόδοσης για εφαρμογές AWT/Swing που εκτελούνται σε macOS χρησιμοποιώντας το Apple Metal API αντί για το OpenGL. Διαθέτει βελτιωμένο API και βελτιωμένες δυνατότητες για τη δημιουργία τυχαίων αριθμών.

  Διορθώστε τον κίνδυνο θανατηφόρου σφάλματος βροχής στην ενέργεια αριθμός 1

Αλλαγές, διαγραφές και περιορισμοί στην Java 17

Η Java 17 φέρνει επίσης αρκετές αλλαγές, διαγραφές και νέους περιορισμούς.

Ενθυλάκωση εσωτερικών JDK

Μια αλλαγή είναι η ολοκλήρωση της διαδικασίας ενθυλάκωσης του JDK Internals. Η πρώτη φορά που εισήχθη ήταν εντός της Java 9 και θα έδινε προειδοποιήσεις κατά τη διάρκεια του χρόνου εκτέλεσης, όταν ένας χρήστης προσπαθούσε να χρησιμοποιήσει την αντανάκλαση ή κάτι παρόμοιο για να παρακάμψει τους συνήθεις περιορισμούς στη χρήση εσωτερικών API. Προστέθηκαν επίσης ορίσματα γραμμής εντολών για τη ρύθμιση αυτής της συμπεριφοράς.

Από την Java 9, έχουν δημιουργηθεί διάφορα API για να προσφέρουν έναν ομοιόμορφο τρόπο εκτέλεσης των πιο συχνά χρησιμοποιούμενων εργασιών. οι χρήστες θα χρησιμοποιούσαν αυτά τα API εσωτερικά. Με την Java 16, η προεπιλογή άλλαξε από προειδοποίηση σε απενεργοποίηση της πρόσβασης στη δημιουργία εξαίρεσης. Ωστόσο, χρησιμοποιεί το όρισμα της γραμμής εντολών για να αλλάξει τη συμπεριφορά.

Με την Java 17, το όρισμα της γραμμής εντολών καταργείται και είναι δυνατό να απενεργοποιήσετε αυτόν τον περιορισμό. Αυτό σημαίνει ότι προστατεύεται πλέον όλη η μη εξουσιοδοτημένη πρόσβαση σε αυτά τα εσωτερικά API.

Always-Strict Floating-Point Semantics

Μια επιπλέον «κατάργηση» μπορεί να περιγραφεί ως η επανεισαγωγή της σημασιολογίας Always-Strict Floating Point. Η Java 1.2 εισήγαγε τροποποιήσεις στην προεπιλογή σημασιολογίας κινητής υποδιαστολής στην Java που επιτρέπει στο JVM να εμπορεύεται ελάχιστη ακρίβεια στους υπολογισμούς κινητής υποδιαστολής για να βελτιώσει την απόδοση. Σε τάξεις και μεθόδους όπου έπρεπε να χρησιμοποιηθεί αυστηρή σημασιολογία, προστέθηκε μια λέξη-κλειδί αυστηρής fp. Από τότε, διάφοροι τύποι συνόλων εντολών εισήχθησαν στις CPU, κάνοντας αυστηρή σημασιολογία κινητής υποδιαστολής να χρησιμοποιείται χωρίς περιττό κόστος. Η ανάγκη εφαρμογής μιας προεπιλεγμένης ή αυστηρής σημασιολογίας έχει εξαλειφθεί.

Η Java 17 αφαιρεί την προηγούμενη προεπιλεγμένη σημασιολογία και όλες οι λειτουργίες κινητής υποδιαστολής εκτελούνται αυστηρά. Ο όρος αυστηρόπις εξακολουθεί να υπάρχει. Ωστόσο, δεν έχει κανένα αποτέλεσμα και προκαλεί μια προειδοποίηση κατά τη στιγμή της μεταγλώττισης.

Σύνταξη Ahead-of-Time (AOT).

Η Java 9 εισήγαγε τη μεταγλώττιση εκ των προτέρων (AOT) ως μια πειραματική δυνατότητα που χρησιμοποιεί τον μεταγλωττιστή Graal και ένας κώδικας JIT γράφτηκε χρησιμοποιώντας Java. Η Java 10 έκανε τον μεταγλωττιστή Graal να χρησιμοποιηθεί ως μεταγλωττιστής JIT στο OpenJDK ενσωματώνοντας τη διεπαφή JVMCI. Από τότε που κυκλοφόρησε, ήταν μια τεράστια βελτίωση. Ο μεταγλωττιστής Graal έχει δει τεράστιες προόδους και έχει το JVM του με το όνομα GraalVM.

Ενεργοποίηση RMI

Η ενεργοποίηση RMI εξαλείφθηκε στο JEP 407 μετά την αφαίρεσή του από την Java 8 και τελικά καταργήθηκε και επισημάνθηκε ως απαίτηση για κατάργηση εντός Java 15. Η ενεργοποίηση RMI παρείχε μια μέθοδο για την ενεργοποίηση κατανεμημένων αντικειμένων κατ’ απαίτηση πόρων χρησιμοποιώντας RMI. Ωστόσο, είδε ελάχιστη χρήση και μια καλύτερη εναλλακτική είναι διαθέσιμη στο παρόν. Το υπόλοιπο του RMI δεν επηρεάζεται από την εξάλειψη του τμήματος ενεργοποίησης.

  Πώς να απενεργοποιήσετε την καταγραφή και τις ειδοποιήσεις έκθεσης στον COVID-19 στο iPhone

Αφαίρεση Applet API

Το Applet API ορίστηκε τελικά για κατάργηση από JEP 398, αρχικά καταργήθηκε εντός της Java 9. Το Applet API παρείχε έναν τρόπο ενσωμάτωσης των στοιχείων ελέγχου Java AWT/Swing σε μια ιστοσελίδα μέσα σε ένα πρόγραμμα περιήγησης. Ωστόσο, κανένα σύγχρονο πρόγραμμα περιήγησης δεν μπορεί να το υποστηρίξει, πράγμα που σημαίνει ότι οι Applets ήταν ουσιαστικά απρόσιτες την τελευταία δεκαετία περίπου.

ΥΠΕΥΘΥΝΟΣ ΑΣΦΑΛΕΙΑΣ

Η πιο κρίσιμη κατάργηση είναι ότι είναι ο διαχειριστής ασφαλείας ( JEP 411). Το Security Manager χρησιμοποιείται για λίγο από την Java 1.0. Σχεδιάστηκε για να περιορίζει ό,τι μπορούσε να κάνει η Java τοπικά στο μηχάνημα, όπως ο περιορισμός της πρόσβασης σε δίκτυα, αρχεία και άλλους πόρους δικτύου. Προσπαθεί επίσης να δημιουργήσει κώδικα sandbox που δεν είναι αξιόπιστος, αποκλείοντας την ανάκλαση και συγκεκριμένα API.

Το τέλος του Security Manager ξεκίνησε στην Java 12. Προστέθηκε ένα όρισμα γραμμής εντολών για τον αποκλεισμό της χρήσης του Security Manager κατά το χρόνο εκτέλεσης. Η αλλαγή που έγινε στην Java 17 σημαίνει ότι θα δημιουργηθεί μια προειδοποίηση χρόνου εκτέλεσης στο JVM όταν προσπαθείτε να ορίσετε ένα Security Manager, είτε από τη γραμμή εντολών είτε δυναμικά κατά το χρόνο εκτέλεσης.

Θερμοκοιτίδα και δυνατότητες προεπισκόπησης

Πολλοί αναρωτήθηκαν αν η Java 17 θα είχε κάποια προεπισκόπηση και δυνατότητες εκκολαπτηρίου, λαμβάνοντας υπόψη ότι η Java 17 προωθήθηκε ως μια μακροπρόθεσμη υποστηριζόμενη έκδοση. Το Java 17 διαθέτει δύο μονάδες θερμοκοιτίδας και μια δυνατότητα προεπισκόπησης!

Vector API

Vector API ( JEP 414) βρίσκεται επί του παρόντος στη δεύτερη φάση της θερμοκοιτίδας. Το API επιτρέπει στους προγραμματιστές να ορίσουν διανυσματικό υπολογισμό τον οποίο ο μεταγλωττιστής JIT θα μετατρέψει στη συνέχεια στην κατάλληλη διανυσματική εντολή που υποστηρίζεται από την αρχιτεκτονική CPU στην οποία εκτελείται το JVM (για παράδειγμα, χρησιμοποιώντας εκείνα των συνόλων οδηγιών SSE ή AVX).

Πριν, οι προγραμματιστές έπρεπε να χρησιμοποιήσουν βαθμωτές συναρτήσεις ή να δημιουργήσουν εγγενείς βιβλιοθήκες που ήταν συγκεκριμένες για την πλατφόρμα. Η εφαρμογή του Vector API σε Java παρέχει επίσης έναν απρόσκοπτο εναλλακτικό μηχανισμό που ήταν περίπλοκος σε προηγούμενες εκδόσεις.

Η τυποποίηση του Vector API επιτρέπει στις κλάσεις εντός του JDK να το χρησιμοποιούν. Οι μέθοδοι mismatch() του Java Arrays θα μπορούσαν να αλλάξουν ώστε να εκτελούνται σε Java, εξαλείφοντας την απαίτηση διατήρησης και εγγραφής πολλαπλών εφαρμογών για συγκεκριμένες πλατφόρμες εντός του JVM.

API ξένων λειτουργιών και μνήμης

Ένα επιπλέον χαρακτηριστικό της θερμοκοιτίδας ονομάζεται το Foreign Function & Memory API ( JEP 412). Είναι μια εξέλιξη και συγχώνευση δύο άλλων ενοτήτων θερμοκοιτίδας της Java 16 που είναι το Foreign Linker API ( JEP 389) και API ξένης μνήμης ( JEP 393). Και οι δύο παρέχουν πρόσβαση σε εγγενή μνήμη και κώδικα χρησιμοποιώντας στατικά πληκτρολογημένο προγραμματισμό γραμμένο σε Java.

  Λίστα με τους δωρεάν κωδικούς Insider ταινιών της Disney

Αντιστοίχιση μοτίβων για διακόπτη

Το τελευταίο χαρακτηριστικό της προεπισκόπησης γλώσσας που περιλαμβάνεται στην Java 17 είναι η συμπερίληψη του Pattern Matching for Switch ( JEP 406). Αυτή η δυνατότητα γλώσσας επεκτείνει τις εκφράσεις και τις δηλώσεις διακόπτη ανάλογα με τον τύπο, παρόμοια με τη σύνταξη που χρησιμοποιείται μέσω της αντιστοίχισης προτύπων (JEP 394), το οποίο έγινε τυπικό με την Java 16.

Στο παρελθόν, εάν θέλατε να εκτελέσετε διαφορετικές ενέργειες με βάση τη δυναμική φύση ενός αντικειμένου, θα σας ζητούσε να δημιουργήσετε μια αλυσίδα if-else χρησιμοποιώντας μια παρουσία ελέγχων όπως:

String type(Object o) {
  if (o instanceof List) {
    return "A List of things.";
  }
  else if (o instanceof Map) {
    return "A Map! It has keys and values.";
  }
  else if (o instanceof String) {
    return "This is a string.";
  }
  else {
    return "This is something else.";
  }
}

Συνδυάζοντας την έκφραση διακόπτη καθώς και τη νέα δυνατότητα αντιστοίχισης προτύπων για διακόπτες, η διαδικασία μπορεί να μειωθεί σε κάτι παρόμοιο με:

String type(Object o) {
  return switch (o) {
    case List l -> "A List of things.";
    case Map m -> "A Map! It has keys and values.";
    case String s -> "This is a string.";
    default -> "This is something else.";
  };
}

Όπως ίσως έχετε παρατηρήσει, υπάρχει η δήλωση μιας μεταβλητής στη διαδικασία ελέγχου. Όπως και οι άλλες μεταβλητές στο Μοτίβο, η αντιστοίχιση του στιγμιότυπου υποδεικνύει ότι αυτό το αντικείμενο ελέγχθηκε και μεταδόθηκε και είναι διαθέσιμο από τη μεταβλητή στην τρέχουσα περιοχή του.

Η λειτουργία προεπισκόπησης είναι ένα ακόμη βήμα προς την αντιστοίχιση μοτίβων. Το επόμενο βήμα είναι να συμπεριλάβουμε την ικανότητα αποδόμησης πινάκων και εγγραφών.

Πρέπει να κάνετε αναβάθμιση σε Java 17;

Ναι, πρέπει να αναβαθμίζετε συνεχώς στην πιο πρόσφατη έκδοση, ωστόσο όχι από την πρώτη μέρα. Το λογισμικό και οι βιβλιοθήκες που χρησιμοποιείτε ενδέχεται να μην έχουν ενημερωθεί ώστε να περιλαμβάνουν συμβατότητα με Java 17, επομένως ίσως χρειαστεί να περιμένετε για κάποιο χρονικό διάστημα μέχρι να ολοκληρωθεί.

Εάν έχετε κολλήσει με μια έκδοση LTS της Java όπως η Java 8 ή η Java 11, υπάρχουν πολλές επιλογές στη γλώσσα και μέσα στο ίδιο το JVM που απαιτούν αναβάθμιση έως και Java 17. Καθώς είναι μια έκδοση μακροπρόθεσμης συντήρησης, υπάρχει υπάρχει μεγάλη πιθανότητα το περιβάλλον παραγωγής σας να ενημερωθεί τελικά και σε Java 17.

Εάν ξεκινάτε ένα εντελώς νέο έργο ή είστε στη διαδικασία προετοιμασίας του έργου σας για Java 17, η μετάβαση σε Java 17 νωρίτερα παρά αργότερα είναι ίσως η πιο αποτελεσματική επιλογή, καθώς μειώνει το κόστος μετακίνησης. Αυτό επιτρέπει επίσης στους προγραμματιστές που εργάζονται στο έργο να χρησιμοποιούν όλες τις πιο πρόσφατες δυνατότητες και την πλευρά των λειτουργιών.

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