链接分层命名结构的枚举?

时间:2014-10-16 04:45:02

标签: java reflection enums

由于我的内存很糟糕,我喜欢把所有数据对象都放入枚举中,所以我可以在IDE中使用代码完成,而不必继续引用以获取表的名称或者字段的名称。通常我会使用某种类型的只包含枚举的类来实现此目的。

假设我有“域名”(数据库源)“表格”和“字段”表,看起来像这样:

public class DataObjectNames {
    public enum Domains {
        Domain1,
        Domain2;
    }

    public enum Domain1Tables {
        Customers,
        Orders;
    }

    public enum Domain2Tables {
        OrderItems,
        Shipments;
    }

    public enum CustomerFields {
        id,
        email;
    }

    public enum OrderFields {
        id,
        customerId;
    }
    //fields for OrderItems and Shipments . . .
}

但是假设我想做一些像:

Domain1.tables().Customers.fields().  //code completion supplies choices?

在输入句点之后我想要的是自动完成以在.id和.email之间进行选择,就像“fields”使用两种方法返回一个对象一样,或者我只是输入     CustomerFields。 在IDE中。

为了实现这一点,我觉得在某种程度上我不需要返回枚举的特定实例,而是枚举本身。我尝试过各种各样的方法:

public enum Domains {
        Domain1 {
            @Override
            public Enum<?> tables() {
                return Domain1Tables.foo();
            } //Is there a method that will return the enum itself?
        },
        Domain2 {
            @Override
            public Enum<?> tables() {
            return Domain2Tables.foo();
        };

        public abstract Enum<?> tables();
    }

但当然我无法找到返回枚举类本身的函数foo()。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您无法通过枚举执行此操作,因为Java的类模型不能按照您需要的方式工作,以便使用此样式。

我还没有能够找到一个返回枚举类本身的函数foo()。

返回枚举类本身很简单,只需执行Domain1Tables.class,但这不会给你完成所需的功能,因为它给你的是一个Class<Domain1Tables>对象,那个对象没有名为CustomersOrders的字段。

你希望能够对待&#34; Domain1Tables&#34;类就好像它是一个对象并引用枚举常量(它们实际上是静态的最终字段),好像它们是该对象的成员一样,但Java根本就没有这样做。

如果您放弃使用enum,那么您可以简单地使用:

public class DataObjectNames {

    public class Domains {

        class Domain1 {
            class Tables {
                class Customers {
                    public static final String id = "id";
                    public static final String email = "email";
                }
            }
        }
    }
}

但在这种情况下DataObjectNames.Domains.Domain1不再是一个有效的表达式(因为它引用了类范围,但没有引用到对象。

这可能是您尝试做的事情的解决方案,但如果没有更多背景信息,我可以提供比上述内容更多的详细信息。