JavaRush /Blog Java /Random-VI /Có sự khác biệt nào giữa Kotlin và Java không?
Paul Soia
Mức độ
Kiyv

Có sự khác biệt nào giữa Kotlin và Java không?

Xuất bản trong nhóm
Chào mọi người. Tôi muốn nói với bạn một số điều cơ bản về ngôn ngữ Kotlin, ngôn ngữ này sẽ hữu ích cho người mới bắt đầu. Điều đó xảy ra là bây giờ sẽ rất khó để bắt đầu phát triển Android chỉ với một ngôn ngữ - hầu hết các dự án mới bắt đầu được viết bằng Kotlin, hầu hết các dự án làm sẵn đều được viết bằng Java. Có sự khác biệt nào giữa Kotlin và Java không?  - 1Hiện tại, tôi có 4 dự án đang thực hiện: hai dự án ở Kotlin và hai dự án ở Java (một dự án chính lớn và ba dự án nhỏ để sử dụng nội bộ). Khi công ty quyết định viết dự án mới bằng Kotlin, tôi thấy quyết định này có vẻ lạ lùng. Tại sao trộn các ngôn ngữ khác nhau? Hãy để người khác viết bằng Kotlin, tại sao chúng ta lại cần nó? Nhưng không có lối thoát nên tôi quyết định thử một ngôn ngữ mới và bắt đầu học nó. Tất nhiên, đoạn mã đầu tiên được viết hoàn toàn theo phong cách Java, điều này càng làm tăng thêm sự hiểu lầm: tại sao tôi lại cần một ngôn ngữ mới? Nhưng khi sử dụng, tôi ngày càng nhận thấy nhiều ưu điểm hơn và hiện tại (tôi đã viết bằng Kotlin được gần 2 năm) tôi có thể nói rằng Kotlin thuận tiện hơn trong việc phát triển Android. Tôi muốn chỉ ra một số sắc thái mà những người quyết định bắt đầu học Kotlin sau Java sẽ không rõ ràng. Tôi cũng xin nhắc bạn rằng Android sử dụng Java 8, với phiên bản hiện tại là 14. Vì vậy, trước tiên - Biến : Java:
Int a = 1;
String s = "test";
Kotlin:
val a = 1
var b = 2
val c: Int
val d = "test"
Có hai loại biến trong Kotlin: val (chỉ đọc) và var (đọc-ghi). Nên sử dụng val bất cứ khi nào có thể. Không cần thiết phải khai báo loại biến nếu biến đã được khởi tạo. Thứ hai - câu lệnh if/else, switch : Bạn có thường xuyên sử dụng chuỗi câu lệnh này trong Java không:
if (вариант 1)
{...}
else if (вариант 2)
{...}
...
else
{...}
Hoặc như thế này:
switch(выражениеДляВыбора) {
        case (meaning 1):
                Код1;
                break;
        case (meaning 2):
                Код2;
                break;
...
        case (meaning N):
                КодN;
                break;
        default:
                КодВыбораПоУмолчанию;
                break;
        }
Trong Kotlin, toán tử when được sử dụng cho các biểu thức như vậy (mặc dù if/else cũng có thể được sử dụng):
val x = 5
val result = when(x) {
        0, 1 -> "cool"
        2 -> "bad"
        5 -> "normal"
        else -> "error"
}
System.out.println(result)
Ở đây, chúng tôi không chỉ xem qua chuỗi điều kiện mà còn gán ngay toàn bộ biểu thức cho biến kết quả, điều này giúp chúng tôi tiết kiệm được khá nhiều dòng mã. Tuy nhiên, nếu bạn chỉ có hai tùy chọn trong một nhánh, tôi khuyên bạn nên sử dụng if..else thông thường. Thời gian xây dựng sẽ chỉ ngắn hơn từ ba lựa chọn. Hãy tiếp tục - Nhà xây dựng . Đây là một câu chuyện cổ tích. Chỉ cần so sánh mã trong Java và Kotlin. Java:
public class Person {

    private String firstName;
    private String lastName;
    private int age;

    public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
Kotlin:
class Person(private val firstName: String,
             private val lastName: String,
             private var age: Int) {
}
Có vẻ như có điều gì đó chưa được hoàn thiện trong mã Kotlin. Nhưng không, đây là hai mã giống hệt nhau ở các ngôn ngữ khác nhau. Hãy tìm hiểu nó một chút. Trong Kotlin, hàm tạo có thể được viết trực tiếp trong phần nội dung của tên lớp (nhưng nếu muốn, bạn có thể thực hiện theo cách cũ, như trong Java). Vì vậy, chúng ta đã viết ba biến, trong Java chúng ta đã tạo một hàm tạo, các getters và một setter cho biến age. Trong Kotlin, như chúng ta nhớ, biến val ở chế độ chỉ đọc và do đó, trình thiết lập cho các biến này không có sẵn (Kotlin tự triển khai các trình thiết lập getter). Biến var cho phép bạn sử dụng setter. Kết quả là chúng tôi đã viết gần như trong một dòng cùng một thứ mà phải mất hơn chục dòng trong Java. Ở đây tôi khuyên bạn nên đọc thêm về các lớp dữ liệu trong Kotlin. Nhưng đó không phải là tất cả những gì các nhà xây dựng Kotlin giỏi. Nhưng nếu bạn cần hai hàm tạo thì sao? Nếu có ba thì sao? Trong Java nó sẽ trông như thế này:
public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

public Person(String firstName) {
        this.firstName = firstName;
    }
Không có gì phức tạp, chỉ cần có nhiều nhà thiết kế cần thiết, đó là những gì họ đã làm. Trong Kotlin, bạn có thể thực hiện chỉ bằng một hàm tạo. Làm sao? Thật đơn giản - giá trị mặc định.
class Person(private val firstName: String,
             private val lastName: String? = null,
             private var age: Int = 5) {
}
Chúng ta đã gán các giá trị mặc định trong hàm tạo và bây giờ việc gọi chúng sẽ trông như thế này:
Person(firstName = "Elon", lastName = "Mask", age = 45)
Person(firstName = "Elon", age = 45)
Person(firstName = "Elon", lastName = "Mask")
Câu hỏi có thể nảy sinh: đây là gì:
private val lastName: String? = null
Những dấu hỏi khác này là gì? Có, nếu giá trị có thể là null thì nó được đặt ?. Ngoài ra còn có một tùy chọn như thế này - !!(nếu biến không thể chấp nhận null). Hãy tự đọc về nó, tất cả đều đơn giản. Và chúng ta chuyển sang điểm tiếp theo. Tiện ích mở rộng . Đây là một công cụ rất thú vị trong Kotlin nhưng không có trong Java. Đôi khi trong một dự án, chúng tôi sử dụng các phương thức mẫu được lặp lại trong nhiều lớp. Ví dụ như thế này:
Toast.makeText(this, "hello world :)", Toast.LENGTH_SHORT).show();
Trong Kotlin, chúng ta có thể mở rộng một lớp:
fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
Và sau đó sử dụng nó như thế này trong suốt dự án:
context?.toast("hello world")
Chúng tôi đã tạo một phần mở rộng cho lớp Ngữ cảnh. Và bây giờ, bất cứ nơi nào bối cảnh có sẵn, phương thức chúc mừng mới của nó sẽ có sẵn. Điều này có thể được thực hiện cho bất kỳ lớp nào: Chuỗi, Đoạn, các lớp tùy chỉnh của bạn, không có hạn chế nào. Và điểm cuối cùng chúng ta sẽ xem xét là Làm việc với Chuỗi . Mọi thứ đều đơn giản ở đây. Trong Java nó được viết như thế này:
String s = "friends";
int a = 5;
System.out.println("I have" + a + s + "!");
Nó dễ dàng hơn trong Kotlin:
val s = "friends"
val a = 5
println("I have $a $s!")
Đây là những sắc thái mà tôi gặp phải khi bắt đầu học Kotlin, tôi hy vọng điều này sẽ giúp ích cho bạn.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION