我应该为主程序变量使用静态变量吗?

时间:2013-03-08 23:13:03

标签: java static

我已经阅读了这篇文章,所以我知道应该如何避免静态变量,它们不是面向对象的,它们就像全局变量等。

但这是我的问题,希望不是重复: 我有一些私有类变量,许多方法使用和传递将是乏味的。我正在谈论的课程是我的主要课程,  所以它的唯一实例将是JVM创建的实例。

在这种情况下,如果这些变量是静态的,它会有什么不同吗? (也许如果用户多次打开我的应用程序并且我将变量设置为静态,他们会共享变量并相互混合?)

我想使用静态,因为想要从枚举内部访问这些变量。感谢

以下是枚举部分的代码:

enum Buttons {

    OPEN_BUTTON("Open file...",false),
    CHANGE_FONT_BUTTON("Change font",false),
    DECOR_BUTTON("Decor font",true),
    EDITOR_BUTTON("Open editor",false),
    ALPHABET_BUTTON("Open alphabet browser",false),
    CTEST_BUTTON("Start consonant test",false),
    TESTTYPE_BUTTON("Select test type...",false),
    TEST_BUTTON("Start word test",false),
    QUIT_BUTTON("Quit", false);

    private ButtonBase button;

    Buttons(String title, boolean toggle) {
        if (toggle) button = ToggleButtonBuilder.create().prefWidth(200).prefHeight(35).text(title).build();
        else button = ButtonBuilder.create().prefWidth(200).prefHeight(35).text(title).build();}

    void onClick(EventHandler<MouseEvent> eh) {button.setOnMouseClicked(eh);}
    ButtonBase getBase() {return button;}
    boolean toggled() { return ((ToggleButton)button).isSelected();  }
    void setToggle(boolean on) {((ToggleButton) button).setSelected(on); }
    void enable() {button.setDisable(false);}
    void disable() {button.setDisable(true);}
    void setText(String text) { button.setText(text);}
    void clicked() {

//这就是我想拥有事件处理程序的地方......

3 个答案:

答案 0 :(得分:4)

你说:

  

我正在使用JavaFx并且我正在将我的按钮变成枚举,并且我想在枚举中添加ActionEvent(单击)处理程序,所以它在一个地方整齐地放置。处理程序需要访问类变量。

这不是一个好的设计,不是静态变量的原因,也是枚举的误用。你正在通过这种设计抛弃OOP的所有好处,所以我敦促你不要这样做。请注意,如果/当您更新或修改代码时,您将经常更改GUI组件,并且枚举应该(几乎)永远不会更改。它们应该代表你逻辑的不变基石。它们不应该用于当前按钮状态更改的对象。

我还建议在这里使用单例模式,因为不需要将它用于GUI组件(事实上,单例与枚举非常相似)。为什么不简单地创建一个View类?

答案 1 :(得分:2)

如果你发现你经常传递相同的数据,那么在我看来,数据可能具有一定的相关性 - 可能通过将数据封装到某种价值对象中,你不需要有效地使用全局数据数据?

答案 2 :(得分:-1)

在单个类加载器中,静态字段始终是共享的。要将数据显式地定位到线程,您需要使用类似ThreadLocal的工具。

Link

因此,如果您在ThreadLocal中使用静态,那么您的应用的多个实例就不会出现问题。