Kotlin:财产制定者的文件

时间:2018-04-16 08:47:53

标签: java kotlin javadoc kdoc

我正在写一个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 referenceJava interop page中的setter。

我觉得这很烦人,因为Kotlin与Java有很好的互操作。

会感激任何想法。

1 个答案:

答案 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级别兼容。