如何在Java中声明常量层次数据结构?

如何在Java中声明常量层次数据结构?,java,Java,我希望能够声明一个Java类Ref,这样我就可以在代码的其他地方执行如下操作: switch (v) { case Ref.LicenseCode: ....; case Ref.Widget.MaxWeight: ....; case Ref.Widget.MolyBolt.ThreadsPerInch: ....; } Ref是一种常量数据结构,表示一组常量值的层次结构,如标准文件或其他参考资料中经常出现的常量值。我想

我希望能够声明一个Java类Ref,这样我就可以在代码的其他地方执行如下操作:

switch (v)
{
case Ref.LicenseCode:                     ....;
case Ref.Widget.MaxWeight:                ....;
case Ref.Widget.MolyBolt.ThreadsPerInch:  ....;
}
Ref是一种常量数据结构,表示一组常量值的层次结构,如标准文件或其他参考资料中经常出现的常量值。我想要真正恒定的值(这样它们就可以在case语句中使用)

我想我可以通过嵌套类定义来做到这一点,它是有效的。。。到了一定程度。例如:

public final class Ref
{
    public final static int LicenseCode = 800;

    public final class Widget
    {
        public final static int MaxWeight = 5000;
    }
}
让我这样写:

switch (v)
{
case Ref.LicenseCode:                     ....;
case Ref.Widget.MaxWeight:                ....;
}
但当我尝试筑巢到第三层时:

public final class Ref
{
    public final static int LicenseCode = 800;

    public final class Widget
    {
        public final static int MaxWeight = 5000;

        public final class MolyBolt
        {
            public final static int ThreadsPerInch = 12;
        }
    }
}
我被告知:

"Ref.Widget.MolyBolt cannot be resolved or is not a field."

我做错什么了吗?还是我碰到了Java的一个边缘?有没有其他方法可以实现我的目标?我在WindowsVista下运行,JCK1.6.0-21,使用EclipseJava开发工具3.5.2.r352。

在我看来像是物料清单信息。将其作为静态数据嵌入Java类对我来说似乎非常严格。将其存储在关系数据库、层次数据库、对象数据库或图形数据库中要自然得多

另一个问题是,处理这个问题的代码将是一个由if/then/else或switch语句组成的意大利面森林


很难夸大这是多么的错误。您可能会得到一个允许您继续的答案,但这只能以悲伤告终。

您如何引用
ThreadsPerInch
字段?这对我很有用:

public final class Ref {
    public final static int LicenseCode = 800;
    public final class Widget {
        public final static int MaxWeight = 5000;
        public final class MolyBolt {
            public final static int ThreadsPerInch = 12;
        }
    }
    public static void main(String[] args) {
        int v = Integer.valueOf(args[0]);
        switch (v) {
            case Ref.LicenseCode:
                break;
            case Ref.Widget.MaxWeight:
                break;
            case Ref.Widget.MolyBolt.ThreadsPerInch:
                break;
        }
    }
}

我唯一要改变的是使内部类是静态的,尽管您可能不会实例化这个类的任何对象

钼不是一个领域。这是一门课。您的意思是“Ref.Widget.MolyBolt.ThreadsPerInch”吗?对不起,尝试引用Ref.Widget.MolyBolt.ThreadsPerInch,结果错误是“Ref.Widget.MolyBolt无法解析或不是字段”。这些奇怪的常量、许可证代码和权重等只是或多或少的随机示例。我心里确实有一棵更合理的树,但它是相当机密的。一个更真实的例子可能是关于太阳系的常数表,包括所有行星和卫星。如果我能写:case Solar.Sun.Weight:。。。。;case Solar.Mars.Deimos.Weight:。。。。;然后我可能会做我需要的一切。奇怪的是,你的例子在我的想法中运行良好。您是否尝试过在没有Eclipse的情况下编译它?这是一个嵌入式产品,存储一个恒定的、不变的层次数据结构似乎是理想的解决方案,如果我能让它工作的话。我不明白您认为哪些代码很难访问;我只是在说一种数据结构,如果你能提出一种更清晰、更简洁的方法来查找常量值,我支持它。在嵌入式类的层次结构中,除了硬编码Java以外的任何东西都会更好。见鬼,将其存储在XML文档中并使用XPath搜索内存中的DOM可能会更好。除了你的建议,什么都可以。那是胡说八道。因此,如果我们用xml而不是java,以几乎相同的结构编写相同的信息,突然之间会更好吗?为了什么?是的,好多了。如果用XML编写,您将能够读取、解析它,并使用标准DOM树将其存储在内存中。您可以使用XPath来查询它。我认为您严重低估了更改的可能性和编码的复杂性。事实上,我看到“莫利·博尔特”向我暗示,你可能是一名机械工程师,被要求实施类似物料清单的解决方案。这接近目标吗?@不可改变-一点也不疯狂。对于这样的数据,我宁愿使用Java层次结构以外的任何东西。许多数据持久化技术就是为了这个目的而发明的。我认为你和OP很可能严重低估了这种方法在未来6-18个月内会带来的困难。我现在有两位回应者告诉我,他们没有任何问题。我会调查这个。。。也许我遇到了月食问题。我会回来报告的。我会使用抽象静态。见鬼,使用界面。非常感谢你们,你们告诉我它对你们有用。正如您所料,我正在编写一段比我上面给出的示例大得多的代码。事实上,我正在尝试转换一个现有的大型数据结构,它不是恒定的(甚至不是不变的!),并且我一直在使用Eclipse来检查可能的解决方案。该文件很大,由于我的实验,该文件稍后会出现一些错误。事实证明,其中一个错误是我的错误消息的根本原因。。。当我删除了所有尚未更新的代码后,问题就解决了。