Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin数据类:toString()为什么导出私有属性_Kotlin - Fatal编程技术网

Kotlin数据类:toString()为什么导出私有属性

Kotlin数据类:toString()为什么导出私有属性,kotlin,Kotlin,这个Kotlin数据类 data class PhoneNumber(val prefix: String, private val lineNumber: String) 具有私有属性行号 创建对象时: val phoneNumber = PhoneNumber("0676", "123456") // toString() = PhoneNumber(prefix=0676, lineNumber=123456) 我不希望toString()函数也公开lineNumber 约书亚·布洛赫

这个Kotlin数据类

data class PhoneNumber(val prefix: String, private val lineNumber: String)
具有私有属性
行号

创建对象时:

val phoneNumber = PhoneNumber("0676", "123456")
// toString() = PhoneNumber(prefix=0676, lineNumber=123456)
我不希望
toString()
函数也公开
lineNumber

约书亚·布洛赫(Joshua Bloch)用有效的Java编写

提供对toString()返回的值中包含的所有信息的编程访问


如果不这样做,库的客户端将解析
toString()
结果以访问
lineNumber


有人知道为什么Kotlin默认不在数据类中的
toString()
中隐藏私有属性吗?

我不确定Kotlin为什么允许在数据类构造函数中使用私有属性,但在我看来,对于,您希望所有数据属性都是公共的,并在
equals()
hashCode()
toString()
copy()
中使用


如果不是这样的话,那么我不会将此类类称为“数据类”,应该显式实现
equals()
hashCode()
,等等。如果不这样做,库的客户端将解析
toString()
结果以访问
lineNumber
”——即使
toString()中没有包含
他们仍然可以使用反射来访问字段值。我要说的是,这两种方法都是最后的手段,无论是谁,都必须意识到后果(破坏封装)。也许问题应该是,“Kotlin数据类:为什么允许私有数据属性?”我想说
有效的Java
不一定适用于Kotlin:)我建议用Kotlin打开一个缺陷/增强请求。这似乎是不恰当的行为。我理解这样做的原因,但它不应该是imho的默认行为。为数据类更改toString()的行为将是向后不兼容的更改,因此我们(Kotlin团队)不太可能有很多场景,其中一个数据类的部分信息是“私有的”。只要想想任何涉及PCI/PII合规性的事情(cvv、密码等)。我认为这应该作为缺陷/增强请求提交给kotlin,以从toString()中删除私有值。它有一股难闻的气味。@Ryba、CVV号码、密码、SSN和其他敏感信息在RAM中的存储时间不应超过必要的时间。盐和散列应用于身份验证/比较/查找/等,而不是原始数据。这种敏感信息也应该使用字符数组而不是
字符串
()来存储。这也将导致更合适的字符串表示:
PhoneNumber(前缀=0676,行号=[C@610455d6)
尽管我仍然会质疑将此类信息放入数据类的适当性。虽然所有这些都是事实,但您必须承认,它作为原始信息进入系统的时间点是存在的。只需考虑任何类型的Http请求POJO。要获取信息,它将不经过过滤、未加密等发送到服务器……我认为根据定义,它位于数据bean中的目的正是它应该具有的。数据bean应该有一个getter,它返回事物的salt/hash版本是的。但这也是为什么保存在其中的私有变量不应该在toString()中公开的原因例如,我很想进一步抵制,但是是的,这样的私有信息必须在某个时间点存储在内存中。然而,我仍然不认为您希望在包含此类信息的POJO上使用
equals()
hashCode()
,这样就不能简单地用
数据标记这样的POJO。