gpt4 book ai didi

java - 静态类/常量字段层次结构 - 可以做到吗?

转载 作者:行者123 更新时间:2023-11-30 04:32:01 25 4
gpt4 key购买 nike

我想要实现的是对我的数据库表的一个很好的抽象。我正在寻找的结果是能够做到这一点:

System.out.println(Table.Appointment);    // prints the name of the table 
System.out.println(Table.Appointment.ID); // prints the name of the column

这是我所接近的,但字段似乎优先于静态内部类。

public class Table {

// attempt to allow 'Table.Appointment' to resolve to a String
public static final Table Appointment = new Table("Appointment");

// attempt to give access to column names within the table,
// these class names should be the same as its name field above.
public static final class Appointment{
public static final String ID = "AppointmentId";
};

private String name;
private Table(String name){ this.name = name; }
public String toString() { return name; }
}

这真的可以实现吗?

最佳答案

虽然我强烈反对您所做的事情,只是因为它使您的应用程序过于坚固,但这是有效的(编辑以避免循环引用。):

public final class Table {

// ===== DECLARE YOUR INSTANCES HERE =====

static public final AppointmentTable Appointment = new AppointmentTable();
// static public final FooTable Foo = new FooTable();

// =======================================

static private abstract class TableImpl {
public abstract String getTableName();
public String toString() { return getTableName(); }
}

// ==== DECLARE YOUR DEFINITIONS BELOW ====

static public class AppointmentTable extends TableImpl {
public final String ID = "appointmentId";
// public final <type> <columnName> = <dbFieldName>;

public String getTableName() { return "appointment"; }
private AppointmentTable() {}
}

// static public class FooTable extends TableImpl { ... }

}

这是您能得到的最接近您想要的结果。请注意,用户实际上不会看到这种设计,只有程序员会......所以谁在乎呢?

此外,访问 Table.AppointmentTable 是正常的。您可以通过这种方式访问​​Table.Appointment.ID。但是您无法创建它的实例,也无法扩展它,但这一切都很好。

** 编辑 **

为什么有这个限制?因为你不能只使用类型并将其视为值。类型定义容器,而不是内容。尽管您不能 System.out.println(int); 因为 int 是一个 token (或类型或容器),但您不能将类名作为您可以回显的值。除此之外,这就是为什么你有 Table.AppointmentTable.class.getSimpleName() (或 .getName())。

你只能用值(value)观来工作。类定义不是一个值,它是一个容器的定义。该类定义的变量保存该容器的内容,您可以从中回显或操作。

同样的事情也发生在未分配的变量上。如果你尝试:

int foo;
System.out.println(foo);

编译器会提示 foo 未初始化。这是因为声明变量不会为其分配任何内容(您声明一个名为 fooint 类型的容器),不会使其保存任何内容,除非您分配了某些内容(内容)到它。

关于java - 静态类/常量字段层次结构 - 可以做到吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14410608/

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