gpt4 book ai didi

java - 在 Java 中模拟静态方法调用的静态抽象和动态链接

转载 作者:IT老高 更新时间:2023-10-28 20:34:44 25 4
gpt4 key购买 nike

简介

作为免责声明,我已阅读 Why can't static methods be abstract in Java而且,即使我恭敬地不同意关于“逻辑矛盾”的公认答案,我也不希望任何关于 static abstract 有用性的答案只是对我的问题的回答;)

我有一个代表数据库中一些表的类层次结构。每个类都继承了 Entity 类,该类包含许多用于访问数据库、创建查询、转义字符等的实用方法。

类的每个实例都是数据库中的一行。

问题

现在,为了尽可能多地分解代码,我想为每个类添加有关相关列和表名的信息。这些信息必须可以在没有类实例的情况下访问,并且将在 Entity 中用于构建查询等。

存储这些数据的明显方式是每个类中的静态方法返回的静态字段。问题是您不能强制类实现这些静态方法,也不能对 Java 中的静态方法调用进行动态链接。

我的解决方案

  1. 使用 HashMap 或任何类似的数据结构来保存信息。问题:如果信息丢失,错误将在运行时而不是编译时。
  2. 对实用函数使用并行类层次结构,其中每个对应的类都可以被实例化并使用动态链接。问题:代码繁重,如果类不存在则运行时错误

问题

您将如何应对抽象方法上缺少 abstract static 和动态链接?

在理想情况下,如果某个类的信息丢失并且数据应该可以通过 Entity 类轻松访问,那么给定的解决方案应该会产生编译错误。

答案不需要使用 Java,C# 也可以,欢迎任何关于如何在没有任何语言的特定代码的情况下执行此操作的见解。

为了清楚起见,除了简单之外,我根本没有任何要求。没有什么必须是静态的。我只想从 Entity 中检索表名和列名来构建查询。

一些代码

class Entity {
public static function afunction(Class clazz) { // this parameter is an option
// here I need to have access to table name of any children of Entity
}
}

class A extends Entity {
static String table = "a";
}

class B extends Entity {
static String table = "b";
}

最佳答案

您应该使用结合 javac 注释处理器的 Java 注释,因为它是最有效的解决方案。然而,它比通常的注释范例要复杂一些。

This link向您展示如何实现将在编译时使用的注释处理器。

如果我重用你的例子,我会这样:

@Target(ElementType.TYPE)
@Retention(RetentionType.SOURCE)
@interface MetaData {
String table();
}

abstract class Entity {}

@MetaData(table="a")
class A extends Entity {}

@MetaData(table="b")
class B extends Entity {}

class EntityGetter {
public <E extends Entity> E getEntity(Class<E> type) {
MetaData metaData = type.getAnnotation(MetaData.class);
if (metaData == null) {
throw new Error("Should have been compiled with the preprocessor.");
// Yes, do throw an Error. It's a compile-time error, not a simple exceptional condition.
}
String table = metaData.table();
// do whatever you need.
}
}

在你的注解处理中,你应该检查注解是否设置,值是否正确,编译失败。

完整的文档可在 package javax.annotation.processing 的文档中找到。 .

另外,如果你搜索“java注解处理”,网上也有一些教程。

我不会深入探讨这个主题,因为我自己以前从未使用过该技术。

关于java - 在 Java 中模拟静态方法调用的静态抽象和动态链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5203799/

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