gpt4 book ai didi

java - 如何创建自己的资源类型注释(如 @StringRes)?

转载 作者:行者123 更新时间:2023-12-01 10:40:30 25 4
gpt4 key购买 nike

Android 提供 support annotations ,而且我对 @StringRes 系列注释特别感兴趣,这些注释用于标记整数参数,迫使您传递有效资源而不是任何随机值。

使用 Android Studio,我查看了 @StringRes 的实现,并将其复制到我项目中自己的自定义类中:

package com.foo.bar.model.db;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.CLASS;

/**
* Denotes that an integer parameter, field or method return value is expected
* to be an integer resource reference (e.g. {@link android.R.integer#config_shortAnimTime}).
*/
@Documented
@Retention(CLASS)
@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE})
public @interface IntPk {
}

使用这个新的@IntPk注释,我想标记映射数据库整数外键的类的整数字段,希望我不会混合来自不同表/类的外键整数值(因此,我将为每个类设置 FooPkBarPk 等)。但是,当我编写这样的代码时:

    @IntegerRes int androidValue;
androidValue = 42;
@IntPk int customValue;
customValue = 42;

Android Studio 仅突出显示 androidValue 分配,如以下屏幕截图所示:

annotation trolling level over 9000

因此,很明显,验证是由定义注释的类之外的其他执行的。这种情况发生在哪里?更重要的是,我如何对自定义 @IntPk 进行与 Android SDK 对 @StringRes 相同的检查,并将其存储在我的项目中以供团队中的其他开发人员使用具有相同级别的额外类型检查?

最佳答案

Powerlord 是正确的,您需要编写一个注释处理器。注释处理器将分析您的源代码并发出有关注释和代码之间不匹配的警告。您可以复制和修改 Android Studio 中内置的任何内容。

另一种可能性是在 Checker Framework 的基础上构建,一个旨在使编写注释处理器变得更容易的工具。它的Fake Enumeration Checker或其 Subtyping Checker可能已经完成了您需要的操作,或者您可以编写自己的检查器来执行您的规则。虽然这是一个更具表现力和灵活的解决方案,但缺点是它没有集成到 Android Studio 中。

关于java - 如何创建自己的资源类型注释(如 @StringRes)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34439539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com