我发现新的value class我发现目的是这样的:value class向变量添加属性并约束其使用。我想知道值类的一些实际用法是什么。
value class
bejyjqdl1#
正如文档Kotlin Inline classes中所述有时候,业务逻辑有必要为某个类型创建一个 Package 器。然而,由于额外的堆分配,它会引入运行时开销。此外,如果 Package 的类型是基元类型,性能损失是可怕的,因为基元类型通常由运行时进行了大量优化,而它们的 Package 器没有得到任何特殊处理。为了解决这些问题,Kotlin引入了一种特殊的类,称为内联类。内联类是基于值的类的子集。它们没有标识,只能保存值。
ca1c2owp2#
值类在以下情况下会很有帮助,例如,您希望清楚某个值使用的单位:一个函数期望我以米每秒或公里每小时的单位传递值吗?英里每小时呢?你可以添加函数期望的单位的文档,但是这仍然容易出错。值类迫使开发人员使用正确的单位。您还可以使用值类为项目中的其他开发人员提供对数据进行操作的明确方法,例如从一个单元转换为另一个单元。值类也不是赋值兼容的,所以它们被当作实际的新类声明:当一个函数需要一个整数的值类时,你 * 仍然 * 必须传递你的值类的一个示例--整数是不起作用的。使用类型别名,你仍然可能意外地使用底层类型,从而引入代价高昂的错误。换句话说,如果你只是想让东西更容易阅读,你可以只使用类型别名;如果你需要东西在某种程度上是严格和安全的,你可能想使用值类。
2条答案
按热度按时间bejyjqdl1#
正如文档Kotlin Inline classes中所述
有时候,业务逻辑有必要为某个类型创建一个 Package 器。然而,由于额外的堆分配,它会引入运行时开销。此外,如果 Package 的类型是基元类型,性能损失是可怕的,因为基元类型通常由运行时进行了大量优化,而它们的 Package 器没有得到任何特殊处理。
为了解决这些问题,Kotlin引入了一种特殊的类,称为内联类。内联类是基于值的类的子集。它们没有标识,只能保存值。
ca1c2owp2#
值类在以下情况下会很有帮助,例如,您希望清楚某个值使用的单位:一个函数期望我以米每秒或公里每小时的单位传递值吗?英里每小时呢?你可以添加函数期望的单位的文档,但是这仍然容易出错。值类迫使开发人员使用正确的单位。
您还可以使用值类为项目中的其他开发人员提供对数据进行操作的明确方法,例如从一个单元转换为另一个单元。
值类也不是赋值兼容的,所以它们被当作实际的新类声明:当一个函数需要一个整数的值类时,你 * 仍然 * 必须传递你的值类的一个示例--整数是不起作用的。使用类型别名,你仍然可能意外地使用底层类型,从而引入代价高昂的错误。
换句话说,如果你只是想让东西更容易阅读,你可以只使用类型别名;如果你需要东西在某种程度上是严格和安全的,你可能想使用值类。