繁体   English   中英

Kotlin 中空类的目的是什么?

[英]What is the purpose of empty class in Kotlin?

我正在浏览Kotlin参考文档,然后我看到了这个。

类声明由类名、类头(指定其类型参数、主构造函数等)和类主体组成,用花括号括起来。 header 和 body 都是可选的; 如果类没有主体,则可以省略大括号。

class Empty

现在我想知道没有标题和正文的类声明有什么用

空类可用于与其他类一起表示状态,尤其是作为密封类的一部分时。 例如。

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

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

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

即使是空类也是Any类型,因此自动具有某些方法 我认为在大多数情况下,这没有意义,但在文档情况下,它用于显示类的最简单的可能定义。

Java 等效项是:

public final class Empty {
}

从实际程序员的日常角度来看,空班确实没有多大意义。 然而,在某些情况下,这种行为是可取的。

在某些情况下,我们要确保我们要定义一个类,同时我们要确保永远不会创建该类的实例(从此类类创建的类型称为empty typeuninhabited type ) .

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

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

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

Nothing 也可以与开始投影一起使用,其中类型Function<*, String>可以被投影到Function<in Nothing, String>

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

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

一些语言使用空类进行元编程,尽管我没有亲自探索这部分: C++ 中空类的优势

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

@SpringBootApplication
class FooApplication

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

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

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

class Address

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM