层次命名结构的链式枚举



由于我的内存很差,我喜欢将数据对象的所有细节都放入枚举中,这样我就可以在IDE中使用代码完成,而不必一直引用来获取表名或字段名。通常,我会使用一些只包含枚举的类。

假设我有一个"域"(数据库源)"表"one_answers"字段"的表,看起来像这样:

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

当然,我还没能找到一个返回enum类本身的函数foo()。

有什么想法吗?

您不能用enum来实现这一点,因为Java的类模型不能以您需要的方式工作,从而使这种风格发挥作用。

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

返回枚举类本身很容易,只需执行Domain1Tables.class,但这不会给您想要的完成,因为它给您的是一个Class<Domain1Tables>对象,而该对象没有名为CustomersOrders的字段。

您希望能够将"Domain1Tables"类视为对象,并将枚举常量(实际上是静态的最终字段)引用为该对象的成员,但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将不再是一个有效的表达式(因为它引用的是类作用域,而不是对象

你想做的事情可能有一个解决方案,但如果没有更多的上下文,我可以提供比上面更多的细节。

相关内容

  • 没有找到相关文章

最新更新