Ιστορικό έκδοσης Java. Χειριστής Diamond για ανώνυμα μαθήματα

Ηλεκτρονική 23.04.2019

Επισκόπηση προγράμματος Η έκδοση υπολογιστή του Microsoft Excel Viewer θα επιτρέψει... ChercherΑναμένεται ότι το νέο

Ακολουθεί μια λίστα με σημαντικές καινοτομίες στην Java 9:

Χρησιμοποιώντας παραδείγματα, θα σας πούμε περισσότερα για αυτές τις λειτουργίες.

JShell

ΑΝΤΙΚΑΤΑΣΤΑΣΗ (Αγγλικός βρόχος ανάγνωσης-αποβολής-εκτύπωσης) - ένα σύστημα για διαδραστικός προγραμματισμόςστην κονσόλα. Δηλαδή, εάν ο χρήστης εισάγει μια γραμμή κώδικα, το αποτέλεσμα της εκτέλεσής του εμφανίζεται στην κονσόλα και αυτή η διαδικασία επαναλαμβάνεται.

Παρουσιάστηκε η Oracle νέο εργαλείοονομάζεται "JShell". Χρησιμοποιείται για τη δοκιμή και τη χρήση διαφορετικών δομών στην κονσόλα, όπως κλάσεις, διεπαφές, απαριθμήσεις, αντικείμενα, τελεστές κ.λπ.

Παρεμπιπτόντως, μπορείτε ήδη να κατεβάσετε την έκδοση beta του JDK 9 κατεβάζοντάς την απόεπίσημη ιστοσελίδα .

Το πιο απλό παράδειγμαεργασία με JShell:

G:\>jshell | Καλώς ήρθατε στο JShell -- Έκδοση 9-ea | Για έναν τύπο εισαγωγής: /help intro jshell> int a = 10 a ==> 10 jshell> System.out.println("a value = " + a) a value = 10

Αμετάβλητα αντικείμενα λίστας, συνόλου και αντιστοίχισης εκτός πλαισίου

Η Oracle έχει εισαγάγει πολλές πρακτικές μεθόδους για τη δημιουργία αμετάβλητων αντικειμένων List, Set, Map και Map.Entry χωρίς τη χρήση πρόσθετων κλάσεων

Σε Java SE 8 και νεότερη έκδοση προηγούμενες εκδόσειςμπορούμε να χρησιμοποιήσουμε το Collections.unmodifiableXXX για να δημιουργήσουμε αμετάβλητα αντικείμενα συλλογής. Για παράδειγμα, εάν θέλουμε να δημιουργήσουμε μια αμετάβλητη λίστα, θα χρησιμοποιήσουμε τη μέθοδο Collections.unmodifiableList.

Οι διεπαφές List και Set έχουν μεθόδους από(). Παραδείγματα χρήσης τους μπορείτε να δείτε παρακάτω:

List immutableList = List.of(); // άδεια αμετάβλητη λίστα List immutableList = List.of("one","two","tree"); // αμετάβλητη λίστα που περιέχει πληροφορίες

Το Map έχει δύο σύνολα μεθόδων: τις μεθόδους of() και τις μεθόδους ofEntries() για τη δημιουργία αντικειμένων Immutable Map και Map.Entry.

Jshell> Χάρτης κενόςImmutableMap = Map.of() whiteImmutableMap ==> () // κενός αμετάβλητος χάρτης jshell> Χάρτης nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "tree") nonemptyImmutableMap = => (2=δύο, 3=τρία, 1=ένα) // αμετάβλητη εμφάνιση

Ιδιωτικές μέθοδοι σε διεπαφές

Στην Java 8, μπορούμε να παρέχουμε υλοποίηση μεθόδου σε διεπαφές χρησιμοποιώντας προεπιλεγμένες και στατικές μεθόδους. Ωστόσο, δεν μπορούμε να δημιουργήσουμε ιδιωτικές μεθόδους σε διεπαφές.
Για να απαλλαγούμε από την ακαταστασία και τον πλεονασμό κώδικα, η Oracle πρόκειται να προσθέσει ιδιωτικές μεθόδους Διεπαφές Java SE 9. Ξεκινώντας από την ένατη έκδοση, θα μπορούμε επίσης να δημιουργήσουμε ιδιωτικές στατικές μεθόδους σε διεπαφές χρησιμοποιώντας ιδιωτικό.

Δημιουργία υλοποίησης μεθόδου για την προεπιλεγμένη διεπαφή:

Κοινό Κάρτα διεπαφής( private Long createCardID() ( // Η υλοποίηση της μεθόδου συμβαίνει εδώ. ) private static void displayCardDetails() ( // Η υλοποίηση της μεθόδου συμβαίνει εδώ. ) )

Αρθρωτό σύστημα

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

Εδώ είναι μερικά από τα χαρακτηριστικά αυτού του συστήματος:

  • αρθρωτό JDK;
  • αρθρωτό πηγαίος κώδικαςΙάβα;
  • αρθρωτές εικόνες χρόνου εκτέλεσης.
  • ενθυλάκωση εσωτερικών API.
  • αρθρωτό σύστημα πλατφόρμας?

Το JDK 9 διαθέτει 92 μονάδες. Μπορούμε να τα χρησιμοποιήσουμε ή να δημιουργήσουμε τα δικά μας, για παράδειγμα:

Ενότητα com.foo.bar ( )

Κάθε λειτουργική μονάδα έχει ένα όνομα, σχετικό κώδικα και άλλους πόρους.

Βελτίωση API

Αναμένονται βελτιώσεις API στο Java SE 9. Θα προστεθούν πολλές νέες κλάσεις και μέθοδοι για περισσότερα βολικός έλεγχοςενέργειες του λειτουργικού συστήματος.
Δύο νέες διεπαφές στο Process API:

  • java.lang.ProcessHandle;
  • java.lang.ProcessHandle.Info.

Παράδειγμα API διαδικασίας:

ProcessHandle currentProcess = ProcessHandle.current(); System.out.println("Αναγνωριστικό τρέχουσας διαδικασίας: = " + currentProcess.getPid());

Εδώ δημιουργήσαμε ένα αντικείμενο τύπου ProcessHandle για να λειτουργεί με ενέργειες λειτουργικού συστήματος.

Αλλαγές στο try-with-sources

Όπως γνωρίζουμε, η Java SE 7 εισήγαγε μια νέα κατασκευή χειρισμού εξαιρέσεων που ονομάζεται Try-With-Resources για αυτόματο έλεγχοπόροι. Το Java SE 9 πρόκειται να κάνει μερικές αλλαγές σε αυτό το σχέδιο για να βελτιώσει την αναγνωσιμότητα.
Παράδειγμα σε Java SE 7:

Το Void testARM_Before_Java9() ρίχνει το IOException ( BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt")); δοκιμάστε (BufferedReader reader2 = reader1) ( System.out.println(reader2.readLine);))()

Παράδειγμα σε Java 9:

Το Void testARM_Java9() ρίχνει το IOException ( BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt")); try (reader1) ( System.out.println(reader1.readLine()); ))

Μπορεί να σημειωθεί ότι σε νέα έκδοση, μετά από δοκιμή δεν είναι απαραίτητο να δηλώσετε μια νέα μεταβλητή.

Τι νέο υπάρχει στο CompletableFuture API

Στην Java 9, η Oracle πρόκειται επίσης να βελτιώσει το CompletableFuture API για την επίλυση προβλημάτων που εμφανίστηκαν στο Java SE 8. Υπάρχουν σχέδια για προσθήκη καθυστερήσεων και χρονικών ορίων, πρόσθετες μέθοδοικαι βελτιώστε τις υποκατηγορίες.

Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);

Εδώ η delayedExecutor() είναι μια στατική μέθοδος που χρησιμοποιείται για την επιστροφή του εκτελεστή μετά από μια δεδομένη καθυστέρηση.

Αντιδραστικός Προγραμματισμός

Για όσους δεν είναι ακόμη εξοικειωμένοι με το παράδειγμα αντιδραστικός προγραμματισμός, συνιστούμε να διαβάσετε το δικό μας στο νήμα με παραδείγματα.
Οι Scala, Play, Akka έχουν ήδη ενσωματώσει αντιδραστικές ροές. Η Oracle αποφάσισε να προσθέσει το Reactive Streams API στο Java SE 9.

Java SE 9 Reactive Streams API - ένα πλαίσιο για την υλοποίηση ασύγχρονων, επεκτάσιμων και παράλληλες εφαρμογέςχρησιμοποιώντας Java.

Τα ακόλουθα API θα εμφανιστούν στο Java SE 9:

  • java.util.concurrent.Flow;
  • java.util.concurrent.Flow.Publisher;
  • java.util.concurrent.Flow.Subscriber;
  • java.util.concurrent.Flow.Processor.

Χειριστής Diamond για ανώνυμα μαθήματα

Ας πούμε ότι έχουμε ένα class Box και θέλουμε να το κάνουμε ανώνυμο.
Δείτε πώς φαίνεται η διαδικασία στην Java 8:

Κουτί createBox(T content) ( // Χρειάζεται να βάλετε ένα "T" εδώ 🙁 επιστρέψτε το νέο Box (περιεχόμενο)( ); )

Δεν είναι προφανές ότι το Box πρέπει να είναι τύπου Τ; Ο μεταγλωττιστής, στην περίπτωση μιας μη ανώνυμης τάξης, θα επέλεγε επιθυμητό τύπο, γιατί να μην κάνουμε το ίδιο και με τους ανώνυμους;

Το πρόβλημα είναι οι μη-δηλωτοί τύποι, οι οποίοι αναγνωρίζονται από τον μεταγλωττιστή, αλλά όχι από το JVM. (Μια τέτοια περίπτωση μπορεί να χειριστεί ο μεταγλωττιστής, αλλά το ερώτημα είναι πώς να τη διαβιβάσει σωστά στο JVM.)

Επομένως, ο χειριστής Diamond δεν επιτρέπεται να χρησιμοποιείται με ανώνυμες κλάσεις. Τώρα είναι δυνατό.

Δείτε πώς φαίνεται στην Java 9:

Τάξη σε Java ( Κουτί createBox(T content) ( // Η Java 9 βγάζει "T" επειδή αυτός είναι ο τύπος που υποδηλώνεται με την επιστροφή νέου πλαισίου<>(περιεχόμενο)( );)ΚουτίcreateCrazyBox(Περιεχόμενο αντικειμένου) ( Λίστα<>innerList = Arrays.asList(content); // Αλλά αυτός ο τύπος δεν εμφανίζεται, αφού δεν μπορούμε να τον υποδηλώσουμε: // επιστρέφουμε νέο Πλαίσιο

(innerList) ( );

// Αντίθετα, ορίζουμε τον τύπο που χρειαζόμαστε: επιστροφή νέου κουτιού >(innerList) ( );

) )

Πρόσθετες βελτιώσεις στα μαθήματα

Ρεύμα
emp = getEmployee(id); Ροή empStream = emp.flatMap(Προαιρετικό::ροή);

Αυτό χρησιμοποιεί τη μέθοδο Optional.stream(), η οποία μετατρέπει τα πάντα σε ροή Υπαλλήλων.

Βελτιώσεις API ροής< 5).forEach(System.out::println);

Βελτιωμένοι @Deprecated Annotations

Πριν από την Java 9, το @Deprecated ήταν απλώς μια διεπαφή δείκτη. Πολλοί προγραμματιστές . Ακούστηκαν και προστέθηκε η δυνατότητα εργασίας με παλαιού τύπου API. Για παράδειγμα, έχουν εμφανιστεί εργαλεία για την ανάλυσή τους -για Απομάκρυνση και από .

Πελάτης HTTP/2

Η Oracle σχεδιάζει να κυκλοφορήσει ένα νέο πρόγραμμα-πελάτη HTTP για να υποστηρίζει πρωτόκολλα HTTP/2 και WebSocket. Αντικαθιστούν το HttpURLConnection API με ένα νέο, πιο αποδοτικό.
Το νέο API θα παρέχεται στο πακέτο "java.net.http". Υποστηρίζει τόσο σύγχρονη όσο και ασύγχρονη λειτουργία.

Μπορείτε να δείτε το νέο API

Η Java είναι μια εκπληκτικά ευέλικτη γλώσσα προγραμματισμού. Σήμερα υπάρχουν περίπου 6,5 εκατομμύρια προγραμματιστές Java σε όλο τον κόσμο. Και όλα αυτά χάρη στη χρησιμότητα, την ευκολία χρήσης, την ασφάλεια και την ανεξαρτησία της πλατφόρμας (λειτουργεί ανεξάρτητα από το υλικό ή το λειτουργικό σύστημα που χρησιμοποιείται).

Η Java αναπτύχθηκε το 1995 από τη Sun Microsystems και δημιουργήθηκε αρχικά για διαδραστική τηλεόραση και προγραμματισμό ηλεκτρονικών συσκευών ευρείας κατανάλωσης. Ωστόσο, η δημόσια κυκλοφορία της Java 1.0 σημείωσε μια αλλαγή στο επίκεντρο της χρήσης του Διαδικτύου, καθιστώντας την μια από τις πιο δημοφιλείς γλώσσες προγραμματισμού.

Προφανώς, έχουν αλλάξει πολλά από το 1.0 και τελικά, μετά από πολλές μεταφορές, το Java 9 κυκλοφόρησε στις 21 Σεπτεμβρίου 2017.

Τα χαρακτηριστικά της προηγούμενης (8ης) έκδοσης, λόγω της ευελιξίας της, έδωσαν στους προγραμματιστές την ευκαιρία να δημιουργήσουν λύσεις για μια μεγάλη ποικιλία επιχειρηματικών τομέων, συμπεριλαμβανομένων των fintech, της υγειονομικής περίθαλψης και άλλων βιομηχανιών. Οι βασικές καινοτομίες στην Java 8 περιλαμβάνουν εκφράσεις λάμδα, ροές και αλλαγές API.

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

  1. Πλήρης υποστήριξη πελάτη HTTP 2.0: Είναι θέμα ταχύτητας και το HTTP 2.0 παρέχει καλύτερα αποτελέσματα, που κυμαίνονται από 11,81% έως 47,7% σε σύγκριση με τον πελάτη HTTP 1.1.
  2. Jshell: Νέο εργαλείο γραμμής εντολών. Εάν ένας προγραμματιστής θέλει να εκτελέσει μερικές γραμμές Java αυτόνομες, τότε αυτό μπορεί να γίνει χωρίς να χρειάζεται να τυλίξετε τα πάντα σε μια ξεχωριστή μέθοδο ή έργο.
  3. Microbenchmark: Η απόδοση μεμονωμένων μικρών κομματιών κώδικα μπορεί πλέον να μετρηθεί χρησιμοποιώντας μια τυποποιημένη μέθοδο. Η ανάλυση JMH σε νανοδευτερόλεπτα είναι μοναδική για την Java 9.


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

Αυτή είναι ίσως η πιο αναμενόμενη καινοτομία - ένας πελάτης HTTP με υποστήριξη τόσο για το πρωτόκολλο HTTP/2 όσο και για το WebSocket. Εξάλλου, το πρωτόκολλο SPDY της Google, στο οποίο βασίζεται το HTTP/2, δείχνει ήδη βελτιωμένη απόδοση στο ίδιο επίπεδο με το Netty ή το Jetty, υποστήριξη για λειτουργία μη αποκλεισμού (πολλά νήματα ανά αίτημα/απόκριση), καθώς και υποστήριξη Push διακομιστή, που σας επιτρέπει να στέλνετε πόρους στον πελάτη χωρίς ρητή αίτηση.

Το νέο API παρουσιάζεται ως η πρώτη μονάδα θερμοκοιτίδας για Java - ένα πειραματικό χαρακτηριστικό που, εάν αναπτυχθεί σωστά, θα εμφανιστεί επίσημα στην επόμενη έκδοση (δηλαδή Java 10) ή θα αφαιρεθεί. Μια ασυνήθιστη ιδέα για την Java που ενθαρρύνει τον πειραματισμό χωρίς να σπάσει τη συμβατότητα προς τα πίσω.

Το έργο Jigsaw (που μεταφράζεται ως "παζλ") στοχεύει στη διαμόρφωση της Java. Αυτό σημαίνει ότι ο κώδικας του προγράμματος αναλύεται σε μέρη και οργανώνεται σε ενότητες ανάλογα με τις εργασίες που εκτελούν αυτές οι μονάδες. Αυτό επιτρέπει την επαναχρησιμοποίηση των μονάδων και απλοποιεί την οργάνωση και τον εντοπισμό σφαλμάτων τους. Αυτό οδηγεί σε βελτιστοποιημένη και βελτιστοποιημένη ανάπτυξη λογισμικού. Αυτή είναι η βασική διαφορά μεταξύ Java 9 και Java 8.

Το δεύτερο μεγάλο πλεονέκτημα είναι ότι η πλατφόρμα Java γίνεται ελαφρύτερη και πιο επεκτάσιμη. Αυτό επιτρέπει στις εφαρμογές Java να εκτελούνται ακόμη και σε συσκευές με χαμηλή απόδοση (καθώς απαιτούν λιγότερους πόρους για να εκτελεστούν). Αυτή είναι μια μεγάλη αλλαγή ειδικά στο πλαίσιο του Internet of Things (IoT). Ένα βήμα μπροστά για την Java και μια ευκαιρία να δούμε περισσότερες εφαρμογές IoT γραμμένες σε αυτή τη γλώσσα.

Το Jshell θα προσθέσει εγγενή υποστήριξη και θα διαδώσει την προσέγγιση REPL (Read-Eval-Print-Loop) της Java. Είναι ένα διαδραστικό εργαλείο που σας επιτρέπει να δοκιμάσετε μικρά κομμάτια κώδικα χωρίς να χρειάζεται να δημιουργήσετε νέες κλάσεις. Έρχεται με λειτουργίες ιστορικού και αυτόματης συμπλήρωσης, καθώς και μια σειρά από άλλες δυνατότητες, όπως αποθήκευση και φόρτωση γραπτών εκφράσεων.
Για παράδειγμα, εάν θέλετε να εκτελέσετε μόνοι σας πολλές γραμμές Java, τώρα δεν χρειάζεται να τις τυλίξετε σε ξεχωριστό έργο ή μέθοδο. Όσο για τα ερωτηματικά, μπορείτε να τα ξεχάσετε: Υπάρχουν διάφορες εναλλακτικές λύσεις, όπως πρόσθετα REPL για δημοφιλή IDE ή η κονσόλα ιστού Java REPL, αλλά καμία από αυτές δεν είναι επίσημη.

Προστέθηκε ένα ενοποιημένο σύστημα καταγραφής για όλα τα στοιχεία JVM. Ωστόσο, αν δούμε τα πλεονεκτήματα και τα μειονεκτήματα της Java 9, εδώ είναι ένα από αυτά. Δεν υπάρχουν κλήσεις για καταγραφή μεμονωμένων στοιχείων JVM, ούτε καταγράφεται κώδικας Java στο Java Development Kit

Συχνά συναντάμε την λανθασμένη αντίληψη ότι η Java έχει μόνο έναν συλλέκτη σκουπιδιών, ενώ στην πραγματικότητα υπάρχουν 4. Το Parallel / Throughput Collector θεωρούνταν η προεπιλογή στις προηγούμενες εκδόσεις, αλλά τώρα έχει αντικατασταθεί από το G1, το οποίο εισήχθη στην Java 7 και σχεδιάστηκε για καλύτερη υποστήριξη σωρών μεγαλύτερων από 4 GB. Προκαλεί λιγότερες παύσεις GC, αλλά όταν συμβαίνουν, διαρκούν περισσότερο.

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

Αξιοσημείωτες ενημερώσεις API: Concurrency και Stack Walking

Η Java 9 έλαβε μια ενημέρωση για το CompletableFuture και το java.util.concurrent.Flow. Το Flow είναι μια υλοποίηση Java του API Reactive Streams. Τα Reactive Streams βοηθούν στην επίλυση του προβλήματος της αντίστροφης πίεσης - η συσσώρευση μεγάλων ποσοτήτων δεδομένων που συμβαίνει όταν ο ρυθμός λήψης των εισερχόμενων συμβάντων είναι υψηλότερος από τον ρυθμό με τον οποίο τα επεξεργάζεται η εφαρμογή, γεγονός που οδηγεί στην εμφάνιση μη επεξεργασμένων buffer δεδομένων . Επιπλέον, ως μέρος των βελτιώσεων συγχρονισμού, το CompletableFuture έλαβε μια ενημερωμένη έκδοση που αντιμετώπιζε ζητήματα που εντοπίστηκαν από την εισαγωγή του στην Java 8. Περιλαμβάνει υποστήριξη για καθυστερήσεις και χρονικά όρια, βελτιωμένη υποστήριξη υποκλάσης και πολλές χρήσιμες μεθόδους.

Θα ήθελα επίσης να αναφέρω το Stack Walking API. Σωστά, η Java 9 αλλάζει τον τρόπο χειρισμού των ιχνών στοίβας παρέχοντας έναν επίσημο τρόπο χειρισμού ιχνών στοίβας αντί να τις αντιμετωπίζει σαν απλό κείμενο.

Immutable List, Set, Map και Map.Entry API

Η δημιουργία συνόλων πολλαπλών στοιχείων σε Java 8 απαιτούσε πολλές γραμμές κώδικα. Τώρα αυτό μπορεί να γίνει μόνο από έναν. Έτσι, μια από τις πιο χρονοβόρες ελλείψεις της Java 8 έχει εξαλειφθεί. Αυτό θα διευκολύνει την εργασία με πίνακες και θα επιταχύνει ορισμένες λειτουργίες.

Τα οφέλη της Java 9

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

  • Η ταχύτητα είναι πιο γρήγορη χάρη στην υποστήριξη πελάτη HTTP/2.
  • Οι εφαρμογές γίνονται πιο αποδοτικές ως προς τους πόρους επειδή οι προγραμματιστές μπορούν να χρησιμοποιήσουν μόνο τις ενότητες που χρειάζονται και όχι ολόκληρο το JRE.
  • Η ανάπτυξη επιταχύνεται από ένα σύστημα μονάδων που επιτρέπει την επαναχρησιμοποίηση των μονάδων, τον απλοποιημένο εντοπισμό σφαλμάτων και τη διαχείριση.
  • Γίνεται δυνατή η ανάλυση της απόδοσης πολύ μικρών κομματιών κώδικα χάρη στα Microbenchmarks.
  • Τα σύνολα δημιουργούνται με μία γραμμή κώδικα.

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

Sandbox

σκληρός τύπος 26 Μαΐου 2011 στις 11:51 μ.μ

Εκμάθηση Java και απόκτηση πιστοποιητικού «Java SE 6 Programmer».

  • ντουλάπα *

Γεια σου, Χαμπρ!
Θα ήθελα να μοιραστώ την ιστορία του πώς εγώ (ένας 18χρονος φοιτητής) πήρα στα σοβαρά τη μελέτη της Java SE 6 και, ως εκ τούτου, έλαβα το πιστοποιητικό «Oracle Certified Professional, Java SE 6 Programmer».
Η ανάρτηση καλύπτει τις τελευταίες πραγματικότητες απόκτησης πιστοποιητικού και συγκεντρώνει συνδέσμους προς άλλα άρθρα, βιβλία, τεστ.
Ποιος ενδιαφέρεται να λάβει ένα τόσο υπέροχο κομμάτι χαρτί - κάντε κλικ παρακάτω...

1. Γιατί απαιτείται πιστοποίηση;

Εφόσον είστε εδώ, πιθανότατα γνωρίζετε ήδη την απάντηση σε αυτήν την ερώτηση. Θα σου πω για μένα.

  • Χάρις σε παρασκευήΓια την πιστοποίηση μελέτησα μεθοδικά και αρκετές φορές όλες τις κύριες ενότητες της γλώσσας, διαβάζοντας προπαρασκευαστικά βιβλία
  • Όταν προετοιμαζόμουν για τεστ, βρήκα τα αδύνατα σημεία μου και τα εξάλειψα
  • Απέκτησε γνώσεις ανάπτυξης προγραμμάτων, πρακτικές εφαρμογές του OOP, και εξοικειώθηκε με τα Design Patterns
  • Σχεδόν από το μηδέν, αύξησα τις γνώσεις μου στην ανάγνωση αγγλικής τεχνικής λογοτεχνίας (είμαι εξαιρετικά κακός με τη γλώσσα, πιθανότατα χειρότερος από εσάς)
  • Χάρις σε λήψηκομμάτια χαρτιού παγίωσα επίσημα το αποτέλεσμα της μελέτης
  • Αυξημένη αυτοεκτίμηση (δεν υπάρχουν ακόμη πολλά πρακτικά χρήσιμα επιτεύγματα στον προγραμματισμό, οι Ολυμπιάδες δεν μετράνε)
Δεν έχω ψάξει ακόμα για δουλειά, αλλά η πιστοποίηση θα πρέπει να βοηθήσει σε αυτό, στην πραγματικότητα, το να ξεχωρίζω ανάμεσα σε άλλους νέους φοιτητές

2. Πώς γίνεται η αλλαγή;
Η εξέταση γίνεται σε εξουσιοδοτημένη εταιρεία Pearson VUE κέντρο. Παλαιότερα υπήρχε και το Prometric, αλλά από τις αρχές Μαΐου 2011 δεν λειτουργεί με την Oracle. Κόστος (από τον Μάρτιο του 2011) 120$ . Υπήρχαν εκπτώσεις για φοιτητές στη Sun, αλλά τώρα έχουν ακυρωθεί. Η γλώσσα είναι ρωσικά ή αγγλικά, επέλεξα τα αγγλικά γιατί... Λένε ότι η μετάφραση στα ρωσικά είναι στραβή και υπήρχε λόγος να ανέβει το επίπεδο της γλώσσας.
Λάβετε υπόψη ότι κατά την υποβολή αίτησης για εξετάσεις, η ημερομηνία θα εμφανίζεται πρώτα ως μήνας και μετά ως ημέρα. αμερικανικό σύστημα.
Η εξέταση διαρκεί 3 ώρες, τελείωσα και τσέκαρα τα πάντα δύο φορές σε 2. Υπάρχει διαχειριστής και κάμερες στο γραφείο. Πριν ξεκινήσετε, σας ζητούν να βάλετε όλα τα ηλεκτρονικά σας στο διπλανό γραφείο και να σας δώσουν ένα μαρκαδόρο και ένα κομμάτι χαρτί.
Ενοικίαση σε υπολογιστή, σε επιτραπέζια εφαρμογή. 60 ερωτήσεις σε μορφή τεστ. 1 ή περισσότερες επιλογές απάντησης, εάν υπάρχουν πολλές, αυτό θα αναφερθεί. Υπάρχουν επίσης εργασίες για τη μεταφορά κομματιών σε ένα πρόγραμμα κώδικα με κομμάτια που λείπουν. Μπορείτε να βρείτε ένα παράδειγμα στον διαδικτυακό προσομοιωτή Wizlabs, ο σύνδεσμος θα είναι παρακάτω.

Αυτό είναι στην πραγματικότητα το μόνο που καθοδήγησε την προετοιμασία μου. Υπάρχουν πολλές πληροφορίες, αλλά αν καταλαβαίνετε τι συμβαίνει, μπορείτε να μάθετε τη γλώσσα χωρίς προβλήματα.
Συνολικά, χρειάστηκε ένας μήνας για να διαβαστεί ο Eckel σταθερά και 10 μέρες μελέτη του δεύτερου βιβλίου και λήψη τεστ.
Μετά την υποβολή του πιστοποιητικού, θα μπορείτε να αλλάξετε το όνομά σας, εάν το έχετε γράψει λάθος, αλλάξτε τη διεύθυνσή σας. Το πιστοποιητικό έφτασε σε μένα (Gatchina) ακριβώς 50 ημέρες μετά την παράδοση, από το Δουβλίνο.

Καλή τύχη!

Ετικέτες: java 6, πιστοποίηση

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

10 απαντήσεις

Η κλάση java.util.Date στην πραγματικότητα δεν έχει καταργηθεί, απλώς ο κατασκευαστής και μερικοί άλλοι κατασκευαστές/μέθοδοι έχουν καταργηθεί. Αυτό έχει καταργηθεί επειδή αυτή η χρήση δεν λειτουργεί καλά με τη διεθνοποίηση. Αντίθετα, θα πρέπει να χρησιμοποιήσετε την κλάση Ημερολόγιο:

Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, 1988); cal.set(Calendar.MONTH, Calendar.JANUARY); cal.set(Calendar.DAY_OF_MONTH, 1); Ημερομηνία dateRepresentation = cal.getTime();

Οι τάξεις java.util.Date, java.util.Calendar και java.text.SimpleDateFormat ήταν πολύ γρήγορες όταν πρωτοκυκλοφόρησε και εξελίχθηκε η Java. Οι τάξεις δεν σχεδιάστηκαν ή εφαρμόστηκαν σωστά. Έγιναν βελτιώσεις και ανακαλύφθηκαν αποκλίσεις. Δυστυχώς, οι προσπάθειες βελτίωσης απέτυχαν σε μεγάλο βαθμό. Θα έπρεπε αποφύγετε αυτές τις τάξειςκαθόλου. Αντικαθίστανται στην Java 8 από νέες κλάσεις.

Προβλήματα στον κώδικα

Το java.util.Date έχει και μέρος ημερομηνίας και ώρας. Αγνοήσατε το τμήμα χρονισμού στον κώδικά σας. Έτσι, η κλάση Date θα πάρει την αρχή της ημέρας όπως καθορίζεται από την προεπιλεγμένη ζώνη ώρας JVM και θα εφαρμόσει αυτήν την ώρα στο αντικείμενο Date. Επομένως, τα αποτελέσματα του κώδικά σας θα διαφέρουν ανάλογα με τον υπολογιστή που εκτελεί ή τη ζώνη ώρας στην οποία έχει ρυθμιστεί. Μάλλον όχι αυτό που θέλεις.

Εάν χρειάζεστε μόνο την ημερομηνία, χωρίς το τμήμα ώρας, όπως για μια ημερομηνία γέννησης, ίσως να μην θέλετε να χρησιμοποιήσετε το αντικείμενο Ημερομηνία. Μπορείτε να αποθηκεύσετε μόνο τη συμβολοσειρά ημερομηνίας, στη μορφή ISO 8601 ΕΕΕΕ-ΜΜ-ΗΗ. Ή χρησιμοποιήστε το αντικείμενο LocalDate από το Joda-Time (δείτε παρακάτω).

Ώρα Τζόντα

Το πρώτο πράγμα που πρέπει να μάθετε στην Java είναι: Αποφύγετε τις διαβόητα προβληματικές τάξεις java.util.Date και java.util.Calendarπλήρης με Java.

Παράδειγμα κώδικα στο Joda-Time 2.3

DateTimeZone timeZoneNorway = DateTimeZone.forID("Europe/Oslo"); DateTime birthDateTime_InNorway = new DateTime(1985, 1, 1, 3, 2, 1, timeZoneNorway); DateTimeZone timeZoneNewYork = DateTimeZone.forID("America/New_York"); DateTime birthDateTime_InNewYork = birthDateTime_InNorway.toDateTime(timeZoneNewYork); DateTime birthDateTime_UtcGmt = birthDateTime_InNorway.toDateTime(DateTimeZone.UTC); LocalDate birthDate = new LocalDate(1985, 1, 1);

Χωματερή κονσόλας...

System.out.println("birthDateTime_InNorway: " + birthDateTime_InNorway); System.out.println("birthDateTime_InNewYork: " + birthDateTime_InNewYork); System.out.println("birthDateTime_UtcGmt: " + birthDateTime_UtcGmt); System.out.println("birthDate: " + birthDate);

Κατά την εκκίνηση...

BirthDateTime_InNorway: 1985-01-01T03:02:01.000+01:00 birthDateTime_InNewYork: 1984-12-31T21:02:01.000-05:00Ημερομηνία γέννησης2010100000000000 Ημερομηνία γέννησης: 1985-01-01

java.time

Πού μπορώ να βρω τα μαθήματα java.time;

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

Οι απαντήσεις εδώ δείχνουν τη χρήση της κλάσης Calendar, και αυτό ίσχυε μέχρι να βγει η Java 8, αλλά με την Java 8, ο τυπικός τρόπος για να γίνει αυτό είναι:

LocalDate localDate = LocalDate.of(1985, 1, 1);

Και αν χρειάζεστε πραγματικά το java.util.Date, μπορείτε να χρησιμοποιήσετε τις προτάσεις σε αυτήν την ερώτηση.

Για περισσότερες πληροφορίες, ανατρέξτε στο API ή τους οδηγούς για Java 8.

Σημειώστε ότι η Calendar.getTime() δεν είναι ντετερμινιστική με την έννοια ότι το τμήμα ημέρας είναι προεπιλεγμένο στην τρέχουσα ώρα.

Για αναπαραγωγή, δοκιμάστε να εκτελέσετε τον ακόλουθο κώδικα μερικές φορές:

Calendar c = Calendar.getInstance(); c.set(2010, 2, 7); // Σημείωση: 2 σημαίνει Μάρτιος, όχι Φεβρουάριος! System.err.println(c.getTime());

Έξοδος για παράδειγμα:

Κυρ 07 Μαρτίου 10:46:21 CET 2010

Η εκτέλεση του ίδιου κωδικού μετά από μερικά λεπτά δίνει:

Κυρ 07 Μαρτίου 10:57:51 CET 2010

Έτσι, ενώ η set() αναγκάζει τα αντίστοιχα πεδία να προσαρμόσουν τις τιμές τους, εκτελεί το χρόνο του συστήματος στα άλλα πεδία. (Δοκιμασμένο παραπάνω με Sun jdk6 και jdk7)

Ένας από τους λόγους για τους οποίους ο κατασκευαστής έχει καταργηθεί είναι ότι η παράμετρος της τιμής του έτους δεν είναι αυτή που περιμένετε. Το javadoc λέει:

Από την έκδοση JDK 1.1, αντικαταστάθηκε από το Calendar.set (έτος + 1900, μήνας, ημερομηνία) .

Σημειώστε ότι το πεδίο έτους είναι ο αριθμός των ετών από το 1900, επομένως ο κώδικας του παραδείγματος πιθανότατα δεν θα κάνει αυτό που περιμένετε. Και αυτό είναι το θέμα.

Ένα στιγμιότυπο της κλάσης Date έχει μια κατάσταση, δηλαδή ένα συγκεκριμένο χρονικό σημείο. Αν και δεν χρειάζεται να το γνωρίζετε αυτό όταν χρησιμοποιείτε την κλάση Date, ο χρόνος αντιπροσωπεύεται από έναν αριθμό χιλιοστών του δευτερολέπτου (θετικό ή αρνητικό) από ένα σταθερό σημείο, που ονομάζεται εποχή, το οποίο είναι 00:00:00 UTC, 1 Ιανουαρίου, 1970.

Η κλάση Date δεν είναι πολύ χρήσιμη για τον χειρισμό ημερομηνιών. Οι σχεδιαστές της βιβλιοθήκης Java πιστεύουν ότι μια περιγραφή ημερομηνίας όπως "31 Δεκεμβρίου 1999, 23:59:59" είναι μια αυθαίρετη σύμβαση που ελέγχεται από το ημερολόγιο. Η συγκεκριμένη περιγραφή ακολουθεί το Γρηγοριανό ημερολόγιο, το οποίο είναι το ημερολόγιο που χρησιμοποιείται στις περισσότερες χώρες του κόσμου. Το ίδιο χρονικό σημείο θα περιγραφεί διαφορετικά στα ιρανικά ηλιακά (shamsi), κινέζικα ή εβραϊκά σεληνιακά ημερολόγια, για να μην αναφέρουμε το ημερολόγιο που χρησιμοποιούν οι πελάτες σας από τον Άρη.

Οι σχεδιαστές της βιβλιοθήκης αποφάσισαν να διαχωρίσουν τα προβλήματα διατήρησης του χρόνου και τη σύνδεση των ονομάτων με σημεία στο χρόνο. Επομένως, η Πρότυπη Βιβλιοθήκη Java περιέχει δύο ξεχωριστές κλάσεις: την κλάση Date, που αντιπροσωπεύει ένα χρονικό σημείο και την κλάση GregorianCalendar, η οποία εκφράζει ημερομηνίες με οικεία σημειογραφία ημερολογίου. Στην πραγματικότητα, η κλάση GregorianCalendar επεκτείνει την πιο γενική κλάση ημερολογίου, η οποία περιγράφει τις ιδιότητες των ημερολογίων γενικά. Η Java Standard Library περιέχει επίσης τις πραγματικότητες των ταϊλανδικών βουδιστικών και ιαπωνικών αυτοκρατορικών ημερολογίων.

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

If (today.before(birthday)) System.out.println("Ώρα ακόμα να ψωνίσεις για ένα δώρο.");

Η κλάση GregorianCalendar έχει πολύ περισσότερες μεθόδους από την κλάση Date. Συγκεκριμένα, έχει αρκετούς χρήσιμους κατασκευαστές.

Και μερικά άλλα καλούδια στο JDK8, αλλά παρόλα αυτά, αυτή η έκδοση έφερε κάτι χρήσιμο στο οπλοστάσιο ενός προγραμματιστή java. Κάτω από την περικοπή μπορείτε να βρείτε μια πιο λεπτομερή επισκόπηση των καινοτομιών. Για τα πιο ενδιαφέροντα από αυτά, πιθανότατα θα γραφτούν επιπλέον άρθρα με παραδείγματα χρήσης.

Εικονική μηχανή

InvokeDynamic

Μια πολυαναμενόμενη λύση από τους θαυμαστές των δυναμικών γλωσσών προγραμματισμού που σας επιτρέπει να αλληλεπιδράτε με δυναμικές γλώσσες χωρίς σχεδόν καμία απώλεια απόδοσης. Οι προγραμματιστές του JVM επαινούν ιδιαίτερα αυτή τη δημιουργία, αλλά, δυστυχώς, δεν έχουν δώσει ακόμη παραδείγματα χρήσης της στην πραγματική ζωή. Υπάρχει κάποια τεκμηρίωση στη σελίδα του έργου, αλλά δεν είναι καθόλου ασήμαντη. Επομένως, μπορείτε να περιμένετε ένα άρθρο σχετικά με αυτό το θέμα.

Αυστηρός έλεγχος των δυαδικών αρχείων κλάσης

Η Java 7 εισήγαγε έναν νέο επαληθευτή, που ονομάζεται "typechecking verfier", ο οποίος είναι κάπως ταχύτερος και υποστηρίζει νέες δυνατότητες γλώσσας. Αυτός ο επαληθευτής θα χρησιμοποιηθεί σίγουρα για δυαδική έκδοση 51 και νεότερη, δηλαδή >= SE7.

Συντακτική ζάχαρη

Έχουν ήδη γραφτεί πολλά για το Project Coin, συμπεριλαμβανομένου του Habré, οπότε νομίζω ότι δεν χρειάζεται περαιτέρω εισαγωγή. Ωστόσο, μπορείτε πάντα να διορθώσετε το λάθος μου στα σχόλια :) Αξίζει μόνο να σημειωθεί ότι το νόμισμα χωρίστηκε σε δύο μέρη και το πολυαναμενόμενο, που περιέχει ανέσεις όπως απλοποιημένη δημιουργία συλλογών, δεν θα συμπεριληφθεί στο SE 7.

Αλλαγές πυρήνα

Ενημέρωση της αρχιτεκτονικής του classloader

Η νέα έκδοση περιλαμβάνει διορθώσεις στο classloader για να αποφευχθούν αδιέξοδα σε μη ιεραρχικές τοπολογίες loader. Χάρη στο νέο classloader, η ικανότητα του προγραμματιστή να φορτώνει τάξεις έχει επεκταθεί σημαντικά. Μπορείτε να διαβάσετε αναλυτικότερα και αν θέλετε μπορείτε να γράψετε και άρθρο.

μέθοδος κλεισίματος για το URLClassLoader

Δεν υπάρχουν πολλά να πούμε εδώ: τώρα μπορείτε να ελευθερώσετε τους πόρους που κατέχει ο classloader. Διαβάστε περισσότερα.

Ενημερώσεις για java.util.concurrent και συλλογές

Η νέα έκδοση παρέχει πολλές νέες χρήσιμες βιβλιοθήκες για εφαρμογές πολλαπλών νημάτων. Σχετικά με ένα από αυτά, το Phaser, βρίσκεται ήδη στο hub. Εκτός από αυτό, περιλαμβάνονται ένα ελαφρύ πιρούνι/σύνδεση (UPD:) και μερικά άλλα εμπόδια, ταυτόχρονες εκδόσεις καταστρωμάτων σε συνδεδεμένες λίστες και μια τοπική γεννήτρια τυχαίων αριθμών νημάτων. Περισσότερες λεπτομέρειες αναμένονται σε ξεχωριστό άρθρο.

Διεθνοποίηση

Unicode 6.0

Η τελευταία υποστηριζόμενη έκδοση του Unicode είναι πλέον η 6.0.

Βελτιωμένο java.util.Locale

Αυτή η τάξη υποστηρίζει πλέον το IETF BCP 47 (Ετικέτες για τον ορισμό γλώσσας) και το UTR 35 (τοπική σήμανση γλώσσας)

Διαχωρίστε τις τοπικές ρυθμίσεις χρήστη και τις τοπικές ρυθμίσεις GUI

Τώρα η μορφοποίηση κειμένου και η εμφάνιση κάτι στην οθόνη έχουν ανεξάρτητες τοπικές ρυθμίσεις. Περισσότερες λεπτομέρειες μπορείτε να βρείτε στο ενημερωμένο javadoc.

I/O και Δικτύωση

NIO.2

Επίσης, δεν χρειάζεται καμία ειδική εισαγωγή είναι ένα νέο API για πρόσβαση στο σύστημα αρχείων, κλιμακούμενη ασύγχρονη αλληλεπίδραση IO, πλήρης εργασία με αρχεία zip/jar ως σύστημα αρχείων και πολλά άλλα. Είναι λογικό να βάλουμε όλες τις καινοτομίες σε ξεχωριστό θέμα. Μπορείτε να δείτε την επίσημη τεκμηρίωση.

Υποστήριξη προτύπων

Προστέθηκε υποστήριξη SCTP για Solaris, υποστήριξη SDP για υποστήριξη InfitiBand σε Linux και Solaris, υποστήριξη για τη στοίβα IPv6 που εισήχθη στα Windows Vista και υποστήριξη TLS 1.2

Ασφάλεια και κρυπτογράφηση

Οι τυπικοί αλγόριθμοι ελλειπτικής καμπύλης είναι πλέον διαθέσιμοι εκτός συσκευασίας. Ωστόσο, η επίσημη ανακοίνωση δεν παρείχε καμία ένδειξη για το πού θα τα βρούμε. Μια επιφανειακή αναζήτηση για το javax.crypto δεν απέδωσε αποτελέσματα.

Τμήμα πελάτη

Διοχέτευση XRender για Java2D

Χάρη στην επέκταση XRender για X11, η Java2D έχει πλέον πρόσβαση σε πολλές από τις δυνατότητες των σύγχρονων GPU.

Εισαγωγή API για νέες δυνατότητες γραφικών

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

Νέα εμφάνιση και αίσθηση

Προστέθηκε νέα εμφάνιση και αίσθηση. Σύμφωνα με τους προγραμματιστές, ανήκει σε μια νέα γενιά, αλλά προσωπικά δεν εντυπωσιάστηκα. Αν και, φυσικά, αυτό είναι από κάθε άποψη καλύτερο από αυτό που ήταν πριν. Υπάρχουν στιγμιότυπα οθόνης.

Νέος διακοσμητής JXLayer

Δεν μπορείτε να βρείτε πολλές λεπτομερείς πληροφορίες σχετικά με αυτό, υπάρχει ένας σύνδεσμος προς το επίσημο έργο.

Νέο συνθεσάιζερ ήχου

Το παλιό ιδιόκτητο συνθεσάιζερ αντικαταστάθηκε από ένα νέο που ονομάζεται Gervill. Οι προγραμματιστές το επαινούν, αλλά δεν μπορώ να πω τίποτα γι 'αυτό.

Ιστός

Η στοίβα XML έχει ενημερωθεί για να χρησιμοποιεί JAXP 1.4, JAXB 2.2a και JAX-WS 2.2.

Ελεγχος

Το MBeans μπορεί πλέον να αναφέρει φόρτο της CPU τόσο σε ολόκληρο το σύστημα όσο και στο JVM και μπορεί να στέλνει ειδοποιήσεις όταν γίνεται συλλογή σκουπιδιών.

Έτσι, οι περισσότερες από τις καινοτομίες καλύπτονται. Γράψτε στα σχόλια τι θα θέλατε να διαβάσετε περισσότερα.



Συνιστούμε να διαβάσετε

Κορυφή