JavaRush /مدونة جافا /Random-AR /KotlinRush: هل من المنطقي الاستمرار في الكتابة بلغة Java؟...
NikEy
مستوى
Новосибирск

KotlinRush: هل من المنطقي الاستمرار في الكتابة بلغة Java؟

نشرت في المجموعة
مرحبًا، طالب JavaRush، قبل أن تستوعب Java تمامًا، أود توسيع آفاقك ولفت الانتباه إلى لغة Kotlin ذات الشعبية المتزايدة !
KotlinRush: هل من المنطقي الاستمرار في الكتابة بلغة Java؟  - 1
Kotlin هي لغة شابة إلى حد ما تم تطويرها بواسطة JetBrains . نعم، نعم، نفس الشركة التي طورت IDE المفضل لدينا: IntelliJ IDEA. Kotlin هي لغة JVM وهي متوافقة تمامًا مع Java ، أي أنه من كود Kotlin يمكنك الوصول بسهولة إلى مكتبات Java المألوفة.ماذا عن المكتبات: يمكن أن تتواجد فئات Kotlin وJava معًا في حزمة واحدة! حظيت Kotlin بشعبية كبيرة في مجتمع البرمجة لدرجة أن Google اعترفت بها كلغة التطوير الرسمية لنظام Android، ومؤخرًا بدأت Kotlin تكتسب شعبية في مشاريع المؤسسات. في هذه المقالة، أود أن أقدم عدة أمثلة مقارنة للتعليمات البرمجية المكتوبة بلغة Kotlin وJava، وأستخلص بعض الاستنتاجات. يذهب! لنبدأ كالعادة بـ "Hello World"
// Java
public class Application {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
// Kotlin
class Application
fun main(vararg args: String) {
    println("Hello World!")
}
بالنظر إلى مثال Kotlin، يمكننا أن نلاحظ على الفور ما يلي:
  • لا حاجة لكتابة فاصلة منقوطة في نهاية السطر؛
  • يتم وصف جميع الطرق بواسطة الكلمة الأساسية fun ؛
  • لطباعة سطر، كلمة واحدة تكفي - println() !
إنشاء مثيل
// Java (до 10)
final Application application = new Application();
// Kotlin
val application = Application()
اختلافات كوتلين:
  • ليست هناك حاجة للإعلان عن نوع المتغير إذا كان واضحًا من المثال؛
  • بدلاً من نوع المتغير - val (غير قابل للتغيير) أو var (قابل للتغيير)؛
  • لا تحتاج إلى كتابة الكلمة الأساسية الجديدة لإنشاء مثيل !
وصف الأساليب
// Java
public int sum(int a, int b) {
    return (a + b);
}
// Kotlin
fun sum(a: Int, b: Int): Int {
return (a + b)
}
اختلافات كوتلين:
  • إذا كان هناك حاجة إلى إرجاع شيء ما من إحدى الطرق، تتم إضافة " : Int " إلى التوقيع، حيث Int هو نوع الإرجاع؛
  • وصف معلمات الطريقة: أولاً اسم المتغير، ثم النوع؛
  • نظرًا لأن نص الطريقة يتكون من سطر واحد فقط، فيمكنك حذف return :
    fun sum(a: Int, b: Int): Int = (a+b)
إخراج سلسلة منسقة
// Java
public int sum(int a, int b) {
    int result = (a + b);
    System.out.printf("Сумма %d и %d равна %d\n", a, b, result);
    return result;
}
// Kotlin
fun sum(a: Int, b: Int): Int {
    val result = (a + b)
    println("Сумма $a и $b равна $result")
    return result
}
تدعم Kotlin استيفاء السلسلة، فقط استخدم الرمز "$" في بداية المتغير. يعمل هذا التدوين على تحسين نظافة الكود وسهولة قراءته بشكل كبير. مقارنة الحالات
// Java
object1.equals(object2)
// Kotlin
object1 == object2
في Kotlin، تتم ترجمة المقارنة " ==" لأنواع الكائنات إلى equals! ولمقارنة الروابط، ===يتم استخدام " ". الاستثناءات
// Java
public List<String> getFileContent(String file) throws IOException {
    Path path = Paths.get(file);
    return Files.readAllLines(path);
}
// Kotlin
fun getFileContent(file: String): List<String> {
    val path = Paths.get(file)
    return Files.readAllLines(path)
}
لا توجد استثناءات محددة في Kotlin ؛ الآن لا تحتاج إلى طرح استثناء إلى ما لا نهاية من خلال التطبيق بأكمله أو إنشاء استثناءات متعددة المستويات try-catch. سلامة فارغة
// Java
public class Data {
    String value;

    String render() {
        if (value == null) {
            return "Value: undefined";
        } else {
            return "Value:" + value.toUpperCase();
        }
    }
}
// Kotlin
class Data {
    var value: String? = null
    fun render(): String =
            "Value: ${value?.toUpperCase() ?: "undefined"}"
}
اهتم Kotlin بمشكلة NPE وقدم عددًا من المتطلبات:
  • يجب تهيئة جميع حقول ومتغيرات الفصل؛
  • يمكنك كتابة "خالية" في حقل أو متغير، ولكن بعد ذلك يجب أن تقول صراحة أن المتغير الخاص بك هو Nullable (اكتب علامة "؟")؛
  • عامل تشغيل Elvis "?:" يعمل بهذه الطريقة: إذا كان هناك Null على اليسار، فخذ ما هو على اليمين. في حالة مثالنا، عندما لا تتم تهيئة متغير القيمة ، سيتم أخذ القيمة " غير محددة ".
حقول الصف والوصول إليها
// Java
public class Data {
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}
class App {
    void execute() {
           Data data = new Data()
           data.setValue("Foo")
     }
}
// Kotlin
class Data {
    var value: String = ""
}
class App {
    fun execute() {
          val data = Data()
          data.value = "Foo" // Под капотом выполнится data.set("Foo")
     }
}
في Kotlin، يكفي وصف الحقل ببساطة، وهذا كل شيء: فهو يحتوي بالفعل على حروف حروف ومحددات ضمنية (hello lombok )، والتي يمكن تجاوزها في أي وقت إذا رغبت في ذلك. في الوقت نفسه، نقرأ قيمة الحقل ونعدلها ببساطة عن طريق الوصول إليه مباشرة، وتحت الغطاء يطلق عليه get()|set(). دورات
// Java
void example() {
    for(int i = 1; i <= 10; i++) {
        System.out.println(i);
    }

    for(String line : "a,b,c".split(",")) {
        System.out.println(line);
    }
}
// Kotlin
fun example() {
    for(i in 1..10) {
        println(i)
    }

    for(line in "a,b,c".split(",")) {
        println(line)
    }
}
قدمت Kotlin صيغة ملائمة وموحدة لعبور التسلسلات: ما عليك سوى استخدام متغير على اليسار ، وتسلسل على اليمين ، والكلمة الأساسية " in " بينهما، ويتم تحديد النوع تلقائيًا حسب المحتوى. سينجلتون
// Java
public class Singleton {
    private static Singleton ourInstance = new Singleton();

    public static Singleton getInstance() {
        return ourInstance;
    }

    private Singleton() {
    }
}
class App {
    void execute() {
         Singleton singleton = Singleton.getInstance()
    }
}
// Kotlin
object Singleton {}

class App {
    fun execute() {
          val singleton = Singleton
    }
}
يتم استخدام النمط " الفردي " المألوف في كثير من الأحيان في الممارسة العملية، لذلك قرر Kotlin إنشاء كلمة رئيسية منفصلة " كائن "، والتي يتم كتابتها بدلاً من " فئة " وتعني أن الفئة عبارة عن نغمة مفردة؛ عند استخدامها، لا يمكنك حتى بحاجة إلى استدعاء المنشئ أو أي طرق أخرى! معلمات الطريقة المسماة والقيم الافتراضية
// Java
void setStatus(String code) {
    setStatus(code, "");
}

void setStatus(String code, String desc) {
    this.code = code;
    this.desc = desc;
}
// Kotlin
fun setStatus(code: String, desc: String = "") {
    this.code = code;
    this.desc = desc;
}

fun execute() {
    setStatus("200")
    setStatus(code = "200", desc = "Ok")
}
يحدث أنه لا يجب أن تكون جميع المعلمات في الطريقة أو المنشئ مطلوبة، وفي Java اعتدنا على إنشاء مجموعة من الأساليب أو المنشئات لكل مجموعة ممكنة من المعلمات. تم إدخال المعلمات الافتراضية في Kotlin، مما يسمح لك بالإعلان عن طريقة واحدة وتمرير مجموعة المعلمات المطلوبة إليها اعتمادًا على الموقف. تيارات
// Java
String getFirst(List<String> strings, String alpha) {
    return strings.stream()
            .filter(x -> x.startsWith(alpha))
            .findFirst()
            .orElse("");
}
// Kotlin
fun getFirst(strings: List<String>, alpha: String): String {
    return strings.first { it.startsWith(alpha) }
}
أصبح إدخال الدفق في Java 8 وظيفة متكاملة عند العمل مع المجموعات. في Kotlin، أصبحت التدفقات أكثر ملاءمة وعملية: تحتوي كل مجموعة بالفعل على مجموعة من الأساليب المريحة والمستخدمة بشكل متكرر للعمل مع البيانات. لاحظ أيضًا تعبير lambda داخل الطريقة الأولى: إذا كانت الدالة الحرفية تحتوي على معلمة واحدة بالضبط، فيمكن إزالة تعريفها (مع ->)، والإشارة إليها  باسم . لقد حان الوقت للانتهاء... لقد عرضت فقط جزءًا أساسيًا صغيرًا من الوظيفة، لكنني متأكد من أنك تريد بالفعل تجربة Kotlin! من تجربتي يمكنني استخلاص الاستنتاجات التالية:
  • من السهل جدًا على مطور Java إتقان بناء جملة Kotlin والبدء في كتابة التعليمات البرمجية؛
  • Kotlin متوافق تمامًا مع Java، ويمكنك تجربته بالفعل في مشاريعك الحالية، على سبيل المثال، في الاختبارات؛
  • كود Kotlin أكثر وضوحًا وقابلية للقراءة، ولا تحتاج إلى كتابة مجموعة من القواعد المعيارية ؛
  • تحتوي IDEA على محول Java إلى Kotlin تلقائي، ويمكنك أخذ كود Java الجاهز وتحويله تلقائيًا إلى Kotlin؛
  • يجب كتابة مشروع جديد بلغة Kotlin، لأنها من وجهة نظر البنية التحتية تشبه Java، ولكنها أفضل وأكثر ملاءمة من حيث الاستخدام!
إذا أعجبتك المقالة وكانت ذات صلة بشكل عام بمصدر حول Java، فيمكنني الاستمرار في الكتابة عن تجربة استخدام Kotlin في مشروع مؤسسة حقيقي. روابط مفيدة:
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION