繁体   English   中英

kotlin android 中带注释的抽象 val

[英]Abstract val with annotation in kotlin android

我可以写:

@IdRes
abstract fun getHeaderId(): Int

在 kotlin 中使用val而不是fun 它抱怨我在写时需要一个支持字段或委托:

@IdRes <-- errors
abstract val headerId: Int

在这种情况下,哪个是最惯用的? 一个fun或带有支持字段的混乱(我不习惯支持字段,也许是抗变化性,我从未真正使用过它们,所以我认为它们令人不快)

由于抽象valvar只是一个没有支持字段的函数,因此无法通过IdRes注释进行注释,但有一种解决方法。 你可以这样使用它:

@get:IdRes
abstract val headerId: Int

编辑:

为什么这有效? 我们需要仔细检查IdRes注释及其源代码:

@Documented
@Retention(CLASS)
@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE})
public @interface IdRes {
}

正如我们所见,此注解可用于方法、参数、字段和局部变量。 当我们使用abstract val ,它既不是那些,因为它是抽象的,而且在 Java 中我们不能有抽象字段。 通常相当于abstract val something: Int Java 中的abstract val something: Int是:

private int something

public int getSomething() {
    return something;
}

从示例中,很容易看出私有字段就是所谓的属性的支持字段,您不能将它们抽象为抽象字段,这就是问题所在。

正如@AtulGupta 评论中提到的,@theKarlo 的回答不会强制子类传入IdRes

因此,替代

@IdRes
abstract fun getHeaderId(): Int

@get:IdRes
abstract val headerId: Int

是将值传递给类本身的构造函数,这样就可以避免后备字段问题。

例如:

abstract class SomeClass(@IdRes val idRes: Int)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM