静态类/常量字段层次结构 - 它可以完成吗?

时间:2013-01-19 02:41:07

标签: java oop static hierarchy

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

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; }
}

这实际上可以实现吗?

2 个答案:

答案 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"); }
}