Kotlin Android中带有注释的抽象Val

时间:2018-12-19 10:37:41

标签: android kotlin

我可以写:

@IdRes
abstract fun getHeaderId(): Int

在Kotlin中使用val而不是fun吗?它抱怨我写时需要一个后备字段或委托:

@IdRes <-- errors
abstract val headerId: Int

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

2 个答案:

答案 0 :(得分:8)

由于抽象val或var只是没有后备字段的函数,因此无法通过IdRes注释进行注释,但是有一种解决方法。您可以像这样使用它:

@get:IdRes
abstract val headerId: Int

编辑:

这为什么起作用?我们需要仔细检查IdRes批注及其源代码:

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

我们可以看到此注释可以用于方法,参数,字段和局部变量。当我们使用abstract val时,它们都不是,因为它是抽象的,我们在Java中不能有抽象字段。在Java中,通常等效于asbtract val something: Int的是:

private int something

public int getSomething() {
    return something;
}

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

答案 1 :(得分:1)

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

因此,替代

@IdRes
abstract fun getHeaderId(): Int

@get:IdRes
abstract val headerId: Int

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

例如:

abstract class SomeClass(@IdRes val idRes: Int)