[英]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 type
或uninhabited 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.