gpt4 book ai didi

用于类型别名的 Java 注释处理器

转载 作者:搜寻专家 更新时间:2023-11-01 09:42:44 25 4
gpt4 key购买 nike

从我记事起,我就一直怀念 Java 中的类型别名(例如 C++ 中的 typedef 或 haskell 中的 type/newtype)。

在 Android SDK 中,我们有 support annotations其中包括 @IntDef@StringDef 和各种资源类型注释,这有助于我们找出在编译时可能误用整数/字符串值的情况。我插入了一段来自 Android 文档的代码来给你一个简短的想法:

@IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
@Retention(RetentionPolicy.SOURCE)
public @interface NavigationMode {}

public static final int NAVIGATION_MODE_STANDARD = 0;
public static final int NAVIGATION_MODE_LIST = 1;
public static final int NAVIGATION_MODE_TABS = 2;

@NavigationMode
public abstract int getNavigationMode();

public abstract void setNavigationMode(@NavigationMode int mode);

实际上,95% 的情况我想要类型别名都是相同的:当我得到某种数据库行 ID,通常是 longString,这会导致必须对名称中有关变量的类型信息进行编码(例如 long folderIdlong messageId)。但是,StringDef/IntDef 注释有一个烦人的限制:出于某种原因,它们需要一组预定义的常量,因此您只能描述一组有限的值,这对于 DB 标识符来说显然是不够的。

我想要的是某种类似的注释,比如 @TypeAlias 和 Lint 检查,所以我可以这样做:

@TypeAlias
@Retention(RetentionPolicy.SOURCE)
public @interface FolderId { }

@FolderId
public long getFolderIdByName(Database db, String name) {
long id = db.foldersTable().findByName(name).getId();
return id;
/*
we might need to suppress the check here
(because we pass long as a @FolderId long),
but that's okay, since we are aware of
what we are doing here, and it's the only
possible injection point for @FolderId
*/
}

public void deleteMessagesIn(Database db, @FolderId long folder) {
// whatever
}

public void deleteMessagesInInbox(Database db) {
deleteMessagesIn(db, 1); // rejected by Lint, trying to pass long as @FolderId long
deleteMessagesIn(db, getFolderIdByName(db, "Inbox")); // ok, passes Lint check
}

我看不出有什么充分的理由将类型别名注释限制为一组有限值,我们可以像我上面提到的那样通过抑制来解决它,或者可能通过专门为提供类型别名的函数引入另一个注释来解决它。

此外,这不仅仅是关于 Android 注释的限制:任何纯 Java 应用程序也可以从这些类型的别名中受益,而且我没有设法远程搜索任何类似的东西。我们也可以从使用中受益 TYPE_PARAMETER目标,这将使它看起来几乎像真实类型的别名。

所以问题是:

  • 是否有执行这些检查的静态分析器?
  • 如果没有,我是否遗漏了任何阻止它实现的基本限制?再一次,我觉得这很有用,所以如果没有的话,早就有人做了。

附言@mernst 向我指出了 Checker 框架,我设法以一种相对轻松的方式将它与 Android 集成:https://github.com/karlicoss/checker-fenum-android-demo

最佳答案

检查类型别名 (typedef) 是否正确使用的静态分析器是 Fake Enum CheckerChecker Framework 一起分发.它已被用于查找 Swing 和 JabRef 中的错误。

关于用于类型别名的 Java 注释处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39204543/

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