Kotlin空课的目的是什么?

时间:2017-12-01 07:37:19

标签: oop kotlin

我正在经历Kotlin reference document然后我看到了这一点。

  

类声明由类名,类头组成   (指定其类型参数,主要构造函数等)和   班体,四周有花括号。标题和正文   是可选的;如果类没有主体,可以省略花括号。

class Empty

现在我想知道没有标题和正文

的这种类声明的用途是什么

6 个答案:

答案 0 :(得分:5)

空类可以用于表示状态以及其他类,尤其是在密封类的一部分时。例如

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

通过这种方式,您可以将它们视为具有更大灵活性的java enum条目。

答案 1 :(得分:3)

从实际的程序员日常角度看,空课程确实没有多大意义。然而,有些情况需要这种行为。

在某些情况下,我们希望确保我们要定义一个类,同时,我们希望确保永远不会创建此类的实例(从此类创建的类型称为{{1 }或empty type)。

完美的例子是Kotlin uninhabited type类没有类声明头和body(注意它也有私有构造函数) https://github.com/JetBrains/kotlin/blob/master/core/builtins/native/kotlin/Nothing.kt

Kotlin语言中Nothing的用法很少。其中一个是不返回值的函数(不要将此与Nothing混淆,其中函数返回实际返回类型Unit的值)。典型示例是用于测试的Unit方法或退出当前进程的方法。这两种方法都不会实际返回任何值,但我们需要明确地告诉使用特殊类型(assertFail)的编译器。

Nothing

任何内容都可以用于fun assertFail():Nothing { throw Exception() } 可以投射到Function<*, String>的开始投影

空类的另一种用法是类型标记或占位符:

Function<in Nothing, String>

有些语言使用空类进行元编程,尽管我没有亲自探讨过这部分内容: Advantages of an empty class in C++

答案 2 :(得分:2)

tldr:他们想证明这是可能的

它仍然是Any类型,因此会自动确定methods。我认为在大多数情况下,这没有意义,但在文档案例中,它用于显示类的最简单的定义。

Java等价物将是:

public final class Empty {
}

答案 3 :(得分:1)

作为最终结果,它没有多大意义。然而,它在积极开发和设计时可以用作某种占位符,可以在将来扩展。这种简洁的语法允许您根据需要快速定义这些新类型。类似的东西:

%

我认为在文档中特别提到的主要原因是为了证明,语言语法通常可以简洁,而不是专门为常见用法创建。

答案 4 :(得分:1)

Spring Boot框架中的空类用法示例:

@SpringBootApplication
class FooApplication

fun main(args: Array<String>) {
    runApplication<FooApplication>(*args)
}

答案 5 :(得分:0)

密封类在某种意义上是枚举类的扩展:枚举类型的值集也受到限制,但是每个枚举常量仅作为单个实例存在,而密封类的子类可以具有多个实例可以包含状态。 reference