我想要实现的是对我的数据库表的一个很好的抽象。我正在寻找的结果是能够做到这一点:
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; }
}
这实际上可以实现吗?
答案 0 :(得分:2)
虽然我强烈反对你正在做的事情,但仅仅因为它使你的应用程序过于稳固,这是有效的(编辑以避免循环引用。):
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
,您不能将类名视为可以回显的值。除此之外,这就是您Table.AppointmentTable.class.getSimpleName()
(或.getName()
)。
您只能使用值。类定义不一个值,它是一个容器的定义一个值。该类定义的变量保存该容器的内容,您可以从中回显或操作它。
同样的事情与未分配的变量有关。如果您尝试:
int foo;
System.out.println(foo);
编译器会抱怨foo
未被初始化。这是因为声明变量不会为其分配任何内容(您声明一个名为int
的{{1}}类型的容器),除非您为其分配内容(内容),否则不会保留任何内容。
答案 1 :(得分:0)
我会做类似
的事情Table appointment = new Table("appointment" // table name
, "appointmentId" // id column name);
System.out.println(appointment.getTableName());
System.out.println(appointment.getIdColumnName());
如果你想把事情完成到编译时,你可以使用子类。
class Appointment extends Table{
Appointment(){ super("appointment", "appointmentId"); }
}