Java 这是否可以接受使用globals?

Java 这是否可以接受使用globals?,java,design-patterns,Java,Design Patterns,我正在编写一个相当复杂的翻译模块,它本质上是在一种逻辑表示形式和Java代码之间进行翻译。它跨越了几个相互解耦的类 我的问题是,我需要跟踪一组相当广泛的关键字,这些关键字需要插入变量名中。这些关键字必须可供模块中的所有类访问,并且易于更改 我知道globals的使用对于设计来说是一个危险信号,但是在这种情况下,创建一个只提供对所述关键字的静态访问的类是可以接受的吗?例如: public final class KeyWords { public static final String S

我正在编写一个相当复杂的翻译模块,它本质上是在一种逻辑表示形式和Java代码之间进行翻译。它跨越了几个相互解耦的类

我的问题是,我需要跟踪一组相当广泛的关键字,这些关键字需要插入变量名中。这些关键字必须可供模块中的所有类访问,并且易于更改

我知道globals的使用对于设计来说是一个危险信号,但是在这种情况下,创建一个只提供对所述关键字的静态访问的类是可以接受的吗?例如:

public final class KeyWords {
    public static final String SELF = "self";
    public static final String RESULT = "callResult";
    // etc
}
我自己的想法是,它的工作原理有点像一个简单的配置类。我发现这比使用中介或在方法调用之间传递其他bucket类要合理得多,因为数据定义得相当好,而且重要的是,在运行时不受修改


或者,将所有这些关键字放在一个接口中,并让我的所有类继承它,会更好吗?虽然它可以工作,但感觉不太对劲。

这不是最糟糕的事情,但有点过时了。如果您使用的是Java1.5或更高版本,则使用
enum
会更好;例如,它为您提供了类型安全性

public enum KeyWord {
    SELF("self"),
    RESULT("callResult")
    ;

    public String getKeyword() {
        return keyword;
    }

    private KeyWord(String keyword) {
        this.keyword = keyword;
    }

    private final String keyword;
}

你是对的,“把它们塞进一个接口”的方法感觉不对;接口是关于指定行为的,而带有静态final的无方法接口不提供这种行为。自从Java 1.5以来,您可以使用它来获得相同的好处,而不会造成“代码污染”。

这并不是最糟糕的事情,但有点过时了。如果您使用的是Java1.5或更高版本,则使用
enum
会更好;例如,它为您提供了类型安全性

public enum KeyWord {
    SELF("self"),
    RESULT("callResult")
    ;

    public String getKeyword() {
        return keyword;
    }

    private KeyWord(String keyword) {
        this.keyword = keyword;
    }

    private final String keyword;
}

你是对的,“把它们塞进一个接口”的方法感觉不对;接口是关于指定行为的,而带有静态final的无方法接口不提供这种行为。自Java 1.5以来,您可以使用来获得相同的好处,而不会造成“代码污染”。

如果要跨多个互不继承的类使用相同的关键字集,那么我建议只创建一个静态类,该类读取包含所有这些关键字的文本文件

如果你使用这种方法,那么你可以使用“代码一次使用,无处不在”的思想,而专业人士总是喋喋不休

-创建一个静态类

-读入一个保存了所有关键字的文本文件

-编写两个检索和比较关键字的函数

-在你想要的每一个类中使用它,而不用担心碎片


使用此方法还可以更新快照,因为您可以简单地打开文本文件更改添加或删除所需内容,然后在实现它的每个类中都会修复它

如果要跨多个互不继承的类使用同一组关键字,那么我建议只创建一个静态类,该类读取包含所有这些关键字的文本文件

如果你使用这种方法,那么你可以使用“代码一次使用,无处不在”的思想,而专业人士总是喋喋不休

-创建一个静态类

-读入一个保存了所有关键字的文本文件

-编写两个检索和比较关键字的函数

-在你想要的每一个类中使用它,而不用担心碎片


使用此方法还可以更新快照,因为您可以简单地打开文本文件更改添加或删除所需内容,然后在实现它的每个类中都会修复它

这些不是“全局[变量]”。这些是“由稳定标识符命名的常量”。绝对不要[ab]使用这样的界面。根据您的第二个建议:谢谢您的更正。由于我通常不这样编程,我可能错过了定义。所以它们只有在不稳定的情况下才会被认为是全局的?谢谢@hovercraftfullofels,修正了。是的,但请注意我不是这方面的专家。这更多的是我的直觉,而不是专业建议。这些不是“全局[变量]”。这些是“由稳定标识符命名的常量”。绝对不要[ab]使用这样的界面。根据您的第二个建议:谢谢您的更正。由于我通常不这样编程,我可能错过了定义。所以它们只有在不稳定的情况下才会被认为是全局的?谢谢@hovercraftfullofels,修正了。是的,但请注意我不是这方面的专家。这更多的是我的直觉,而不是一个专业建议。假设他们真的是一个枚举-在这种情况下,我无法反驳这一点。假设他们真的是一个枚举-在这种情况下,我无法反驳这一点。