¿Cuál es el propósito de la class vacía en Kotlin?

Estaba repasando el documento de reference de Kotlin y luego lo vi.

La statement de class consiste en el nombre de la class, el encabezado de la class (especificando sus parameters de tipo, el constructor primario, etc.) y el cuerpo de la class, rodeado de llaves. Tanto el encabezado como el cuerpo son opcionales; si la class no tiene cuerpo, las llaves se pueden omitir.

 class Empty 

Ahora me pregunto cuál es el uso de dicha statement de class sin encabezado y cuerpo

Respuesta: propósito de la demostración

Todavía es de tipo Any y, por lo tanto, tiene ciertos methods de forma automática. Creo que en la mayoría de los casos, esto no tiene sentido, pero en el caso de la documentation se usa para mostrar la definición más simple posible de una class.

El equivalente de Java sería:

 public final class Empty { } 

Las classs vacías pueden ser útiles para representar el estado junto con otras classs, especialmente cuando forman parte de una class sellada. P.ej.

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

De esta forma, puedes pensar en ellos como inputs de Java Enum con más flexibilidad.

Desde la perspectiva práctica del progtwigdor día a día, la class vacía no tiene mucho sentido. Sin embargo, hay casos en que este comportamiento es deseable.

Hay escenarios en los que queremos asegurarnos de que queremos definir una class y, al mismo time, queremos asegurarnos de que nunca se creará esa instancia de esta class (el tipo creado a partir de esa class se llama empty type o uninhabited type ) .

Ejemplo perfecto de esto es que la class Nothing Kotlin no tiene encabezado y cuerpo de statement de class (tenga en count que también tiene un constructor privado) https://github.com/JetBrains/kotlin/blob/master/core/builtins/native/kotlin/ Nada.kt

Hay pocos usos para Nothing en el lenguaje de Kotlin. Una de ellas sería una function que no devuelve un valor (no confunda esto con la Unit donde la function devuelve realmente devuelve un valor de tipo Unit ). Un ejemplo típico es un método assertFail utilizado para probar o un método que sale del process actual. Ambos methods nunca devolverán ningún valor, sin embargo, debemos decir explícitamente que se lo explique a un comstackdor utilizando un tipo especial ( Nothing ).

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

Tampoco se puede usar nada con las proyecciones de inicio donde el tipo Function<*, String> se puede proyectar en la Function<in Nothing, String>

Otro uso para la class vacía es tipo token o placeholder:

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

Algunos lenguajes utilizan classs vacías para metaprogtwigr aunque no he explorado esta parte personalmente: Ventajas de una class vacía en C ++

No tiene mucho sentido como resultado final. Sin embargo, puede ser útil en el desarrollo activo y en el momento del layout como un marcador de position de algún tipo, que puede ampliarse en el futuro. Dicha syntax rápida le permite definir rápidamente esos nuevos types según sea necesario. Algo como:

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

Creo que la razón principal de que esto se mencione específicamente en la documentation es demostrar que la syntax del lenguaje en general puede ser concisa, no que está específicamente creada para el uso común.