3

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

但这是我的问题,希望它不会重复:我有一些私有类变量,许多方法使用这些变量并且传递会很乏味。我正在谈论的类是我的主程序,所以它的唯一实例将是 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() {

// 这是我想要事件处理程序的地方...

4

3 回答 3

4

你说:

我正在使用 JavaFx,并且正在将我的 Buttons 制作成一个枚举,并且我想在枚举中添加 ActionEvent (click) 处理程序,所以它们都整齐地放在一个地方。处理程序需要访问类变量。

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

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

于 2013-03-08T23:20:35.290 回答
2

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

于 2013-03-08T23:16:04.727 回答
-1

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

关联

因此,如果您将静态与 ThreadLocal 一起使用,您的应用程序的多个实例不会有问题。

于 2013-03-08T23:20:12.827 回答