Kotlin数据类:toString()为什么导出私有属性
这个Kotlin数据类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 约书亚·布洛赫
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。