Προγραμματισμός

Τι είναι το Kotlin; Η εναλλακτική λύση Java εξήγησε

Το Kotlin είναι μια γλώσσα προγραμματισμού γενικής χρήσης, δωρεάν, ανοιχτού κώδικα, στατισμένη «πραγματιστική», η οποία σχεδιάστηκε αρχικά για το JVM (Java Virtual Machine) και το Android που συνδυάζει αντικειμενοστραφή και λειτουργικά χαρακτηριστικά προγραμματισμού. Επικεντρώνεται στη διαλειτουργικότητα, την ασφάλεια, τη σαφήνεια και την υποστήριξη εργαλείων. Οι εκδόσεις του Kotlin που στοχεύουν το JavaScript ES5.1 και ο εγγενής κώδικας (χρησιμοποιώντας LLVM) για έναν αριθμό επεξεργαστών βρίσκονται επίσης σε παραγωγή.

Το Kotlin προήλθε από την JetBrains, την εταιρεία πίσω από το IntelliJ IDEA, το 2010 και λειτουργεί από το 2012. Η ομάδα του Kotlin έχει σήμερα περισσότερα από 90 μέλη πλήρους απασχόλησης από την JetBrains και το έργο Kotlin στο GitHub έχει περισσότερους από 300 συνεισφέροντες. Η JetBrains χρησιμοποιεί το Kotlin σε πολλά από τα προϊόντα της, συμπεριλαμβανομένης της ναυαρχίδας IntelliJ IDEA.

Το Kotlin ως μια πιο περιεκτική γλώσσα Java

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

StringBuilder sb = νέο StringBuilder ();

Γίνεται στο Κότλιν

val sb = StringBuilder ()

Μπορείτε να δείτε ότι οι συναρτήσεις ορίζονται με το διασκεδαστικο λέξη-κλειδί και ότι τα ερωτηματικά είναι πλέον προαιρετικά όταν υπάρχουν νέες γραμμές. ο βαλ η λέξη-κλειδί δηλώνει μια ιδιότητα μόνο για ανάγνωση ή μια τοπική μεταβλητή. Ομοίως, το var η λέξη-κλειδί δηλώνει μια μεταβλητή ιδιότητα ή μια τοπική μεταβλητή.

Ωστόσο, το Kotlin είναι έντονα δακτυλογραφημένο. ο βαλ και var λέξεις-κλειδιά μπορούν να χρησιμοποιηθούν μόνο όταν μπορεί να συναχθεί ο τύπος. Διαφορετικά, πρέπει να δηλώσετε τον τύπο. Το συμπέρασμα τύπου φαίνεται να βελτιώνεται με κάθε κυκλοφορία του Kotlin.

Ρίξτε μια ματιά στη δήλωση λειτουργίας κοντά στην κορυφή και των δύο παραθύρων. Ο τύπος επιστροφής στην Java προηγείται του πρωτοτύπου, αλλά στο Kotlin διαδέχεται το πρωτότυπο, οριοθετημένο με άνω και κάτω τελεία όπως στο Pascal.

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

Για τους οπαδούς του Groovy, ο Kotlin υλοποιεί κατασκευαστές. Στην πραγματικότητα, οι κατασκευαστές Kotlin μπορούν να ελεγχθούν τύπου. Το Kotlin υποστηρίζει τις κατ 'εξουσιοδότηση ιδιότητες, οι οποίες μπορούν να χρησιμοποιηθούν για την εφαρμογή τεμπέλης ιδιοτήτων, παρατηρήσιμων ιδιοτήτων, ιδιοτήτων βέτο και αντιστοιχισμένων ιδιοτήτων.

Πολλοί ασύγχρονοι μηχανισμοί που διατίθενται σε άλλες γλώσσες μπορούν να υλοποιηθούν ως βιβλιοθήκες χρησιμοποιώντας κορουτίνες Kotlin. Αυτό περιλαμβάνει ασύγχρονος/αναμένω από C # και ECMAScript, κανάλια και επιλέξτε από Go και γεννήτριες/απόδοση παραγωγής από τους C # και Python.

Λειτουργικός προγραμματισμός στο Kotlin

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

Φιλτράρισμα λίστας στο Kotlin

val positives = list.filter {x -> x> 0}

Για ακόμη πιο σύντομη έκφραση, χρησιμοποιήστε το όταν υπάρχει μόνο μία παράμετρος στη συνάρτηση λάμδα:

val positives = list.filter {it> 0}

Διασχίζοντας έναν χάρτη / λίστα ζευγών στο Kotlin

για ((k, v) στο χάρτη) {println ("$ k -> $ v")}

κ καιβ μπορεί να ονομαστεί οτιδήποτε.

Χρήση εύρους στο Kotlin

για (σε 1..100) {...} // κλειστό εύρος: περιλαμβάνει 100

για (σε 1 έως 100) {...} // μισό ανοιχτό εύρος: δεν περιλαμβάνει 100

για (x in 2..10 βήμα 2) {...}

για (x in 10 προς τα κάτω 1) {...}

εάν (x σε 1..10) { ... }

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

Παρόλο που το Kotlin είναι μια πλήρης γλώσσα λειτουργικού προγραμματισμού, διατηρεί το μεγαλύτερο μέρος της αντικειμενοστραφής φύσης της Java ως εναλλακτικό στυλ προγραμματισμού, το οποίο είναι πολύ βολικό κατά τη μετατροπή υφιστάμενου κώδικα Java. Το Kotlin έχει μαθήματα με κατασκευαστές, μαζί με ένθετα, εσωτερικά και ανώνυμα εσωτερικά μαθήματα και έχει διασυνδέσεις όπως το Java 8. Το Kotlin κάνει δεν έχω ένα νέος λέξη-κλειδί. Για να δημιουργήσετε μια παρουσία τάξης, καλέστε τον κατασκευαστή σαν μια κανονική συνάρτηση. Το είδαμε στο παραπάνω στιγμιότυπο οθόνης.

Το Kotlin έχει μια μοναδική κληρονομιά από ένα όνομα superclass και όλες οι τάξεις Kotlin έχουν μια προεπιλεγμένη superclass Οποιος, το οποίο είναι δεν το ίδιο με την κλάση βάσης Java java.lang.Object. Οποιος περιέχει μόνο τρεις προκαθορισμένες λειτουργίες μέλους: ισούται με (), hashCode (), και toString ().

Τα μαθήματα Kotlin πρέπει να επισημαίνονται με το Άνοιξε λέξη-κλειδί για να επιτρέπεται σε άλλες τάξεις να κληρονομούν από αυτές · Τα μαθήματα Java είναι το αντίθετο, καθώς είναι κληρονομικά εκτός επισημαίνονται με το τελικός λέξη-κλειδί. Για να παρακάμψετε μια μέθοδο superclass, η ίδια η μέθοδος πρέπει να επισημανθεί Άνοιξεκαι η μέθοδος της υποκατηγορίας πρέπει να επισημανθεί καταπατώ. Αυτό είναι όλα κομμάτι με τη φιλοσοφία του Kotlin να κάνει τα πράγματα σαφή και όχι να βασίζεται σε προεπιλογές. Σε αυτήν τη συγκεκριμένη περίπτωση, μπορώ να δω πού ο τρόπος του Kotlin να επισημαίνει ρητά τα μέλη της βασικής τάξης ως ανοιχτά για κληρονομικότητα και τα παράγωγα μέλη της κατηγορίας ως παρακάμψεις αποφεύγει διάφορα είδη κοινών σφαλμάτων Java.

Λειτουργίες ασφαλείας στο Kotlin

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

Για παράδειγμα, μια κανονική μεταβλητή τύπουΣειρά δεν αντέχωμηδενικό:

var a: String = "abc"

a = null // σφάλμα σύνταξης

Εάν πρέπει να επιτρέψετε μηδενικά, για παράδειγμα να κρατήσετε αποτελέσματα ερωτήματος SQL, μπορείτε να δηλώσετε έναν μηδενικό τύπο προσθέτοντας ένα ερωτηματικό στον τύπο, π.χ. Σειρά?.

var β: Χορδή;

b = μηδέν // Εντάξει

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

Για να αποφευχθεί η ριζική γραμματική που συνήθως απαιτείται για μηδενικές δοκιμές, ο Kotlin εισάγει ένα ασφαλής κλήση, γραμμένο ?.. Για παράδειγμα, β?. μήκος επιστρέφει β. μήκος αν σι δεν είναι μηδενικό, και μηδενικό σε διαφορετική περίπτωση. Ο τύπος αυτής της έκφρασης είναι Εντ;.

Με άλλα λόγια, β?. μήκος είναι μια συντόμευση για αν (b! = null) b. μήκος άλλο null. Αυτή η σύνταξη αλυσίδες ωραία, εξαλείφοντας αρκετά λογική prolix, ειδικά όταν ένα αντικείμενο συμπληρώθηκε από μια σειρά ερωτημάτων βάσης δεδομένων, οποιοδήποτε από τα οποία ενδέχεται να είχε αποτύχει. Για παράδειγμα, bob? .department? .head? .name θα επιστρέψει το όνομα του επικεφαλής τμήματος του Μπομπ εάν ο Μπομπ, το τμήμα και ο επικεφαλής του τμήματος είναι όλοι μηδενικοί.

Για να εκτελέσετε μια συγκεκριμένη λειτουργία μόνο για μη μηδενικές τιμές, μπορείτε να χρησιμοποιήσετε τον ασφαλή χειριστή κλήσεων ?. μαζί μεαφήνω:

val listWithNulls: List = listOf ("A", null)

για (στοιχείο στη λίσταWithNulls) {

στοιχείο? .let {println (it)} // εκτυπώνει A και αγνοεί το null}

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

val l = b?. μήκος?: -1

είναι το ισοδύναμο του 

val l: Int = if (b! = null) b. μήκος άλλο -1

Στο ίδιο πνεύμα, το Kotlin παραλείπει τις ελεγμένες εξαιρέσεις της Java, οι οποίες είναι συνθήκες ρίψης που πρέπει να πιαστεί. Για παράδειγμα, η υπογραφή JDK

Appendable append (CharSequence csq) ρίχνει IOException;

απαιτεί να πιάσεις IOException κάθε φορά που καλείτε ένα προσαρτώ μέθοδος:

δοκιμάστε {

log.append (μήνυμα)

}

catch (IOException e) {

// Κάντε κάτι με την εξαίρεση

}

Οι σχεδιαστές της Java θεώρησαν ότι ήταν καλή ιδέα και ήταν καθαρή νίκη για προγράμματα παιχνιδιών, εφ 'όσον οι προγραμματιστές εφάρμοζαν κάτι λογικό στο σύλληψη ρήτρα. Πολύ συχνά σε μεγάλα προγράμματα Java, ωστόσο, βλέπετε κώδικα στον οποίο είναι υποχρεωτικός σύλληψη η ρήτρα δεν περιέχει παρά ένα σχόλιο: // todo: χειριστείτε το. Αυτό δεν βοηθά κανέναν και οι ελεγμένες εξαιρέσεις αποδείχθηκαν καθαρή απώλεια για μεγάλα προγράμματα.

Κορουτίνες Kotlin

Οι κορουτίνες στο Kotlin είναι ουσιαστικά ελαφριά νήματα. Ξεκινάτε με το εκτόξευση coroutine builder στο πλαίσιο ορισμένων CoroutineScope. Ένα από τα πιο χρήσιμα πεδία κορουτίνης είναι εκτέλεσηBlocking {}, το οποίο ισχύει για το πεδίο εφαρμογής του μπλοκ κώδικα.

εισαγωγή kotlinx.coroutines. *

fun main () = runBlocking {// αυτό: CoroutineScope

εκκίνηση {// εκτόξευση νέας κορουτίνας στο πλαίσιο του runBlocking

καθυστέρηση (1000L) // καθυστέρηση χωρίς αποκλεισμό για 1 δευτερόλεπτο

println ("Κόσμος!")

    }

println ("Γεια σας")

}

Αυτός ο κωδικός παράγει την ακόλουθη έξοδο, με καθυστέρηση ενός δευτερολέπτου μεταξύ γραμμών:

Γεια,

Κόσμος!

Kotlin για Android

Μέχρι τον Μάιο του 2017, οι μόνες επίσημες υποστηριζόμενες γλώσσες προγραμματισμού για το Android ήταν Java και C ++. Η Google ανακοίνωσε την επίσημη υποστήριξη για το Kotlin σε Android στο Google I / O 2017 και ξεκινώντας με το Android Studio 3.0 Το Kotlin είναι ενσωματωμένο στο σύνολο εργαλείων ανάπτυξης Android. Το Kotlin μπορεί να προστεθεί σε παλαιότερες εκδόσεις του Android Studio με μια προσθήκη.

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

Το Pinterest ήταν το παιδί αφίσας για εφαρμογές Android που γράφτηκε στο Kotlin ήδη από τον Νοέμβριο του 2016 και αναφέρθηκε εμφανώς στο Google I / O 2017 ως μέρος της ανακοίνωσης του Kotlin. Επιπλέον, η ομάδα του Kotlin αρέσει να αναφέρει τις εφαρμογές Evernote, Trello, Square και Coursera για Android.

Κότλιν εναντίον Java

Το ερώτημα αν θα επιλέξουμε το Kotlin ή το Java για νέα ανάπτυξη έχει τεθεί πολύ στην κοινότητα Android από την ανακοίνωση του Google I / O, αν και οι άνθρωποι είχαν ήδη υποβάλει την ερώτηση τον Φεβρουάριο του 2016 όταν το Kotlin 1.0 στάλθηκε. Η σύντομη απάντηση είναι ότι ο κώδικας Kotlin είναι ασφαλέστερος και πιο περιεκτικός από τον κώδικα Java και ότι τα αρχεία Kotlin και Java μπορούν να συνυπάρχουν σε εφαρμογές Android, έτσι ώστε το Kotlin δεν είναι μόνο χρήσιμο για νέες εφαρμογές, αλλά και για την επέκταση υφιστάμενων εφαρμογών Java.

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

Για σχεδόν οποιονδήποτε άλλον κάνει ανάπτυξη Android, τα πλεονεκτήματα του Kotlin είναι συναρπαστικά. Ο τυπικός χρόνος που αναφέρεται για έναν προγραμματιστή Java για να μάθει το Kotlin είναι μερικές ώρες - μια μικρή τιμή που πρέπει να πληρώσει για την εξάλειψη μηδενικών σφαλμάτων αναφοράς, την ενεργοποίηση λειτουργιών επέκτασης, την υποστήριξη λειτουργικού προγραμματισμού και την προσθήκη κορουτίνες. Η τυπική πρόχειρη εκτίμηση δείχνει περίπου 40 τοις εκατό περικοπή στον αριθμό των γραμμών κώδικα από Java έως Kotlin.