2017-12-01 80 views
6

Tôi đã trải qua Kotlinreference document và sau đó tôi đã thấy điều này.Mục đích của lớp học trống trong Kotlin là gì?

Việc kê khai lớp bao gồm các tên lớp, header lớp (ghi rõ các tham số kiểu của nó, các nhà xây dựng chính vv) và cơ thể lớp, bao quanh bởi dấu ngoặc nhọn. Cả tiêu đề và phần thân là tùy chọn; nếu lớp không có cơ thể, có thể bỏ qua các dấu ngoặc nhọn.

class Empty 

Bây giờ tôi đang tự hỏi việc sử dụng các khai báo lớp như vậy mà không tiêu đề và cơ thể là những gì

Trả lời

1

trả lời: mục đích trình diễn

Nó vẫn kiểu Any và do đó có một số methods tự động. Tôi nghĩ rằng trong hầu hết các trường hợp, điều này không có ý nghĩa, nhưng trong trường hợp tài liệu, nó được sử dụng để hiển thị định nghĩa đơn giản nhất có thể của một lớp.

Java tương đương sẽ là:

public final class Empty { 
} 
+0

Kotlin Reddit AMA [ans] (https://www.reddit.com/r/Kotlin/comments/7hoytl/kotlin_team_ama_ask_us_anything/dqt0en5/) – imGs

1

Nó không có ý nghĩa nhiều như một kết quả cuối cùng. Tuy nhiên, nó có thể hữu ích trong phát triển tích cực và tại thời điểm thiết kế như một trình giữ chỗ của một số loại, có thể được mở rộng trong tương lai. Cú pháp ngắn gọn như vậy cho phép bạn nhanh chóng xác định các loại mới như vậy khi cần thiết. Một cái gì đó như:

class Person (
    val FirstName: String, 
    val LastName: String, 
    // TODO 
    val Address: Address 
) 

class Address 

Tôi nghĩ lý do chính này được đề cập cụ thể trong tài liệu là để chứng minh, rằng cú pháp ngôn ngữ nói chung có thể ngắn gọn, không phải là nó được tạo ra đặc biệt cho việc sử dụng chung.

+0

Bạn có thể trực tiếp cho tôi một số loại tham chiếu không? Bởi vì việc khai báo trống không có ý nghĩa thực sự với tôi! – imGs

3

Từ quan điểm lập trình thực tế ngày này sang quan điểm khác, lớp trống không có ý nghĩa gì nhiều. Tuy nhiên, có những trường hợp mà hành vi này là mong muốn. Có những tình huống mà chúng tôi muốn đảm bảo rằng chúng tôi muốn xác định một lớp và cùng một lúc, chúng tôi muốn đảm bảo rằng trường hợp của lớp này sẽ không bao giờ được tạo (kiểu được tạo từ lớp đó được gọi là empty type hoặc uninhabited type).

Perfect ví dụ của việc này là Kotlin Nothing lớp với không có tiêu đề khai báo lớp và cơ thể (chú ý rằng nó cũng có xây dựng tư nhân) https://github.com/JetBrains/kotlin/blob/master/core/builtins/native/kotlin/Nothing.kt

Có vài tập quán cho Nothing trong ngôn ngữ Kotlin. Một trong số đó sẽ là một hàm không trả về một giá trị (không nhầm lẫn điều này với Unit trong đó hàm trả về thực sự trả về một giá trị kiểu Unit). Một ví dụ điển hình là phương pháp assertFail được sử dụng để thử nghiệm hoặc phương pháp thoát khỏi quá trình hiện tại. Cả hai phương thức này sẽ không bao giờ thực sự trả về bất kỳ giá trị nào mà chúng ta cần nói rõ ràng với trình biên dịch bằng cách sử dụng kiểu đặc biệt (Nothing).

fun assertFail():Nothing { 
    throw Exception() 
} 

Không có gì có thể cũng được sử dụng với các dự báo bắt đầu nơi loại Function<*, String> có thể trong dự Function<in Nothing, String>

Một cách sử dụng cho lớp rỗng là gõ dấu hiệu hoặc giữ chỗ:

class DatabaseColumnName 
class DatabaseTableName 
addItem(DatabaseColumnName.javaClass, "Age") 
addItem(DatabaseTableName.javaClass, "Person") 
... 
getItemsByType(DatabaseTableName.javaClass) 

Một số ngôn ngữ là sử dụng các lớp trống cho lập trình meta mặc dù tôi chưa tự khám phá phần này: Advantages of an empty class in C++

4

Các lớp trống có thể hữu ích để biểu diễn trạng thái cùng với các lớp khác, đặc biệt là khi một phần của một lớp được niêm phong. Ví dụ.

sealed class MyState { 
    class Empty : MyState() 
    class Loading : MyState() 
    data class Content(content: String) : MyState() 
    data class Error(error: Throwable) : MyState() 
} 

Bằng cách này, bạn có thể nghĩ chúng giống như các mục nhập enum java linh hoạt hơn.

+0

Có thể tốt hơn là đặt 'Emtpy' và' Loading' thành 'đối tượng' thay vì' lớp'. – Jesper

Các vấn đề liên quan