2017-12-01 2 views
6

Ich wollte durch Kotlinreference document und dann sah ich diese.Was ist der Zweck der leeren Klasse in Kotlin?

Die Klassendeklaration besteht aus dem Klassennamen, die Klasse-Header (dessen Typ-Parameter spezifiziert, der primäre Konstruktor etc.) und die Klasse Körper, durch geschweifte Klammern umgeben ist. Sowohl die Kopfzeile als auch der Körper sind optional; Wenn die Klasse keinen Körper hat, können geschweifte Klammern weggelassen werden.

class Empty 

Jetzt frage ich mich, was das ohne Kopf und Körper Verwendung solchen Klassendeklaration ist

Antwort

1

Antwort: Demonstration Zweck

Es ist immer noch vom Typ Any und daher bestimmte methods automatisch hat. Ich denke, in den meisten Fällen macht das keinen Sinn, aber im Dokumentationsfall wird es verwendet, um die einfachste mögliche Definition einer Klasse zu zeigen.

Das Java-Äquivalent wäre:

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

Es macht nicht viel Sinn als Endergebnis machen. Es kann jedoch in der aktiven Entwicklung und zu einer Entwurfszeit als ein Platzhalter irgendeiner Art nützlich sein, der in der Zukunft erweitert werden kann. Diese knappe Syntax ermöglicht es Ihnen, neue Typen schnell zu definieren. Etwas wie:

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

class Address 

denke ich Hauptgrund dies ausdrücklich in der Dokumentation erwähnt wird, ist, dass Sprachsyntax im Allgemeinen zu demonstrieren, kann kurz und bündig sein, nicht, dass es speziell für die gemeinsame Nutzung erstellt.

+0

Können Sie mir bitte eine Art von Referenz zu richten? Weil nur leere Deklaration für mich keinen Sinn ergibt! – imGs

3

Vom praktischen Programmierer Tag zu Tag Perspektive leere Klasse macht in der Tat keinen viel Sinn. Es gibt jedoch Fälle, in denen dieses Verhalten wünschenswert ist.

Es gibt Szenarios, in denen wir sicherstellen wollen, dass wir eine Klasse definieren wollen und gleichzeitig sicherstellen wollen, dass eine Instanz dieser Klasse niemals erstellt wird (der Typ, der aus dieser Klasse erstellt wird, heißt empty type oder uninhabited type).

perfektes Beispiel hierfür ist Kotlin Nothing Klasse mit nicht Klassendeklaration Header und Körper haben (beachten Sie, dass es auch privaten Konstruktor) https://github.com/JetBrains/kotlin/blob/master/core/builtins/native/kotlin/Nothing.kt

Es gibt nur wenige Verwendungen für Nothing in Kotlin Sprache. Eine davon wäre eine Funktion, die keinen Wert zurückgibt (verwechseln Sie das nicht mit Unit, wo die Funktion zurückgibt, gibt tatsächlich einen Wert vom Typ Unit zurück). Ein typisches Beispiel ist eine assertFail-Methode, die zum Testen verwendet wird, oder eine Methode, die den aktuellen Prozess beendet. Beide Methoden werden niemals tatsächlich irgendeinen Wert zurückliefern, aber wir müssen explizit sagen, dass es einem Compiler mit einem speziellen Typ (Nothing) mitgeteilt wird.

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

Nichts kann auch mit Start Projektionen verwendet werden, bei denen Typ Function<*, String> in den Projektionen zu Function<in Nothing, String>

Eine andere Nutzung für leere Klasse sein kann, ist Typ-Token oder Platzhalter:

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

Einige Sprachen sind benutze leere Klassen für Metaprogrammierung, obwohl ich diesen Teil nicht persönlich untersucht habe: Advantages of an empty class in C++

4

Leere Klassen können nützlich sein, um den Status zusammen mit anderen Klassen darzustellen, insbesondere wenn sie Teil einer versiegelten Klasse sind. Z.B.

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

Auf diese Weise können Sie sie wie Java Enum Einträge mit mehr Flexibilität vorstellen.

+0

Es könnte besser sein, 'Emtpy' und' Loading' zu einem 'Objekt' anstelle einer' Klasse' zu ​​machen. – Jesper

Verwandte Themen