8

我正在写一个 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
        }

    ...
}

但是,如果他们修改(即调用 setter) ,updateExpiry(long)则其行为对 的客户应该是透明的。SessionWrapperexpiryTime

现在,对于 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)
        }

    ...
}

对于 Kotlin 和 Java 代码,只是在 IDE 中没有显示 JavaDoc。

我发现没有明确的方法可以尝试在KDoc 参考Java interop page中分离 Java 可见的 getter 和 setter 的文档。

考虑到 Kotlin 与 Java 的良好互操作性,我觉得这很烦人。

将不胜感激任何想法。

4

1 回答 1

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

于 2018-06-27T18:08:27.583 回答