我正在写一个Kotlin图书馆。在其中一个课程中,我有以下内容:
class SessionWrapper {
/**
* The time in milliseconds after which the session will expire.
*/
var expiryTime = DEFAULT_EXPIRY_TIME
get() {
mainThreadCheck()
return field
}
set(value) {
mainThreadCheck()
field = value
updateExpiry(value) <<< THIS ONE
}
...
}
但是,updateExpiry(long)
的行为应该对SessionWrapper
的客户端透明,如果他们修改expiryTime
(即调用设置者)。
现在,对于Kotlin项目,这不会是一个问题,因为我可以将额外的KDoc添加到expiryTime
属性本身,并且它不会感觉不合适:
/**
* The time in milliseconds after which the session will expire.
*
* Updating the expiry time after the session is started does x,
* the listeners will receive y.
*
* Writing comments is fun, when the tools work.
*/
var expiryTime = DEFAULT_EXPIRY_TIME
但对于Java项目,上面的文档对于setExpiryTime(long)
和getExpiryTime()
都会出现,因为我会在getter中设置 setter JavaDoc,而在setter中使用getter JavaDoc < /强>
尝试以下列方式在Kotlin中分离两个访问者的文档:
class SomeClass{
var expiryTime = DEFAULT_EXPIRY_TIME
/**
* The time in milliseconds after which the session will expire.
*/
get() {
mainThreadCheck()
return field
}
/**
* Updating the expiry time after the session is started does x,
* the listeners will receive y.
*
* Writing comments is fun, when the tools work.
*/
set(value) {
mainThreadCheck()
field = value
updateExpiry(value)
}
...
}
只是在IDE中没有显示JavaDoc,对于Kotlin和&amp; Java代码。
我发现没有明确的方法来尝试分离Java-visible getters&amp;的文档。 KDoc reference或Java interop page中的setter。
我觉得这很烦人,因为Kotlin与Java有很好的互操作。
会感激任何想法。
答案 0 :(得分:2)
我认为您应该重新评估类设计,而不是试图解释文档中的特殊行为。这通常是代码气味的迹象,也可能是可测试性差的迹象。
您应该考虑updateExpiry()
的特殊行为来对类进行建模。 如果这方面值得客户透明,它可能应该是某种接口或协议步骤的一部分。
在不了解其余软件细节的情况下,我能想到的最好的办法就是将设置器设为私有,并添加一个单独的函数来更新expiryTime
:
/** Explain property */
var expiryTime = DEFAULT_EXPIRY_TIME
get() {
mainThreadCheck()
return field
}
private set(value) {
mainThreadCheck()
field = value
}
/** Explain update behavior constraints */
fun updateExpiryTime(value: Any) {
expiryTime = value
updateExpiry(value)
}
不应期望恕我直言Kotlin的Java互操作性会导致产生与Java代码相似的代码。它在字节码级别兼容,而不必在源代码和Javadoc级别兼容。