Tại sao không có từ khóa tĩnh trong Kotlin?


29

Kotlin được biết đến chủ yếu như là một sự thay thế thả xuống cho Java, nhưng nó thoát khỏi cấu trúc Java nổi tiếng: statictừ khóa. Thay vào đó, chức năng cấp lớp đó được cung cấp chủ yếu bởi các đối tượng đồng hành.

Điều gì là sai với các phương thức tĩnh và các trường mà các đối tượng đồng hành cung cấp một sự thay thế tốt hơn? Tôi bối rối về lý do, và không thể tìm thấy bất kỳ lời giải thích nào trong tài liệu.


4
Chỉ cần xem như một người lập trình trong scala: các đối tượng đồng hành tách mã cho các phương thức tĩnh và không tĩnh, chúng có thể mở rộng các lớp hoặc giao diện khác trong ngữ cảnh tĩnh và bạn có thể tham chiếu đối tượng đồng hành trong một biến. không chắc chắn làm thế nào mà bản đồ đến kotlin mặc dù
Phoenix

Các phương thức tĩnh và whatnot có bất kỳ lợi thế đáng kể so với các đối tượng đồng hành?
Tanner Swett

Đây không phải là lý do, nhiều hơn một quan sát, nhưng tôi đã thấy rằng ngay khi các lập trình viên mới bắt đầu (tuyệt đối) phát hiện ra statictừ khóa trong Java, nó ngay lập tức lan truyền đến tất cả các góc của chương trình vì họ chưa được dạy lập trình hướng đối tượng .
Điểm_Under

Câu trả lời:


30

Scala cũng thay thế các khai báo cấp lớp bằng một đối tượng 'Singleton'. Ưu điểm chính của điều này là mọi thứ đều là một đối tượng. Trong Java, các thành viên tĩnh được đối xử rất khác so với các thành viên đối tượng. Điều này có nghĩa là bạn không thể thực hiện những việc như triển khai giao diện hoặc đưa 'thể hiện' của lớp vào bản đồ hoặc chuyển nó làm tham số cho phương thức lấy Object. Đối tượng đồng hành cho phép những điều này. Đó là lợi thế.


2
Đó là một điểm hay. Và tôi đã luôn nghĩ thật kỳ lạ khi có những người độc thân và thống kê có những hành vi rất giống nhau, nhưng không có gì ngoài những đối tượng đồng hành, nó không đi cùng với sự kỳ quặc về khái niệm đó.
dùng1446

1
Và đây chính xác là lý do tại sao trong Java tôi thích định nghĩa các phương thức trên các đối tượng không trạng thái được xây dựng tĩnh hơn là định nghĩa các phương thức tĩnh.
candied_orange

13

Trích dẫn từ các tài liệu tham khảo của Kotlin :

Lưu ý rằng, mặc dù các thành viên của các đối tượng đồng hành trông giống như các thành viên tĩnh trong các ngôn ngữ khác, trong thời gian chạy, chúng vẫn là các thành viên thể hiện của các đối tượng thực và, ví dụ, có thể thực hiện các giao diện.

Nghe có vẻ rất giống với tôi như các nhà thiết kế của Kotlin coi đây là một lợi thế so với các thành viên tĩnh của Java.

Hơn nữa, phần về khả năng tương tác Java và các thành viên tĩnh giải thích cách các đối tượng đồng hành có thể được sử dụng để tạo các thành viên hoạt động hiệu quả như các thành viên tĩnh khi được chú thích @JvmStatic.


6

Kotlin là một ngôn ngữ hướng đối tượng. Trong một ngôn ngữ hướng đối tượng, một cái gì đó không phải là một đối tượng là một hạn chế cực kỳ tê liệt. Các lớp không phải là đối tượng, nhưng đối tượng là đối tượng (duh!), Vì vậy câu hỏi nên là: tại sao một ngôn ngữ sẽ không sử dụng các đối tượng đồng hành?

Một khía cạnh khác là sự đơn giản: tại sao có hai thứ, đối tượng có thành viên thể hiện và lớp có thành viên tĩnh khi bạn chỉ có thể có đối tượng có thành viên thể hiện?

Một cách khác được sử dụng trong nhiều ngôn ngữ có nguồn gốc từ Smalltalk, là tự biến các lớp thành đối tượng. Ví dụ, trong các lớp Smalltalk là các thể hiện của hệ thống phân cấp song song của siêu dữ liệu . Trong Ruby, các lớp là các thể hiện của Classlớp (và vâng, điều đó có nghĩa là đó Classlà một thể hiện của chính nó). Trong trường hợp đó, "các phương thức lớp" thực sự chỉ là các phương thức cá thể bình thường của siêu dữ liệu của lớp. Tôi không biết tại sao thiết kế này không được chọn trong Java (vì nó gần với mối quan hệ với Smalltalk), nhưng nó có thể có liên quan đến việc đơn giản hóa hệ thống loại (lưu ý rằng hầu hết các ngôn ngữ có các đối tượng lớp có xu hướng ngôn ngữ động).


1
"Một khía cạnh khác là sự đơn giản: tại sao có hai thứ, đối tượng có thành viên thể hiện và lớp có thành viên tĩnh khi bạn chỉ có thể có đối tượng với thành viên thể hiện?": Điểm hay, mặc dù không phải tất cả các nhà thiết kế ngôn ngữ / ngôn ngữ đều nhắm đến sự tối giản. Một số người coi đó là một lợi thế để có các cấu trúc đặc biệt cho các trường hợp đặc biệt hoặc thành ngữ.
Giorgio

1
Tôi nghĩ rằng ít nhất có thể tranh cãi rằng Java thực hiện (phần nào) thực hiện mô hình đó. Chẳng hạn, nếu bạn có MyStaticClassmột số staticthành viên, bạn có thể tham khảo MyStaticClass.classđể lấy một Classthể hiện cho lớp đó. Sau đó, bạn có thể sử dụng sự phản chiếu để truy cập / gọi staticthành viên của mình . Vẫn đúng là các staticthành viên không thực sự gắn bó với bất kỳ cá thể đối tượng nào (ít nhất là về mặt khái niệm; không chắc Java thực sự làm gì dưới vỏ bọc). Nhưng điều đó có nghĩa là ít nhất một số giới hạn được nêu trong câu trả lời được chấp nhận không được áp dụng nghiêm ngặt .
aroth
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.