【问题标题】:Should I use static variables for my main program variables?我应该为我的主程序变量使用静态变量吗?
【发布时间】:2013-02-24 15:24:29
【问题描述】:

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

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

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

【问题讨论】:

  • 您的枚举需要如何访问非常量程序变量?这似乎是一个不寻常的设计?我的直觉告诉我,你不应该这样做。 “主程序”如果您指的是具有主方法的类,那么该方法应该尽可能短,并且仅用于创建对象并使它们启动并运行,仅此而已。
  • 我正在使用 JavaFx,并且我正在将我的 Buttons 制作成一个枚举,我想在枚举中添加 ActionEvent(单击)处理程序,所以它都整齐地放在一个地方。处理程序需要访问类变量。
  • 那么答案很简单:这闻起来是糟糕的设计。枚举应该用于常量而不是 GUI 组件。不要这样做。
  • 抱歉错误地尝试插入代码
  • 插入代码作为对主要问题的编辑,而不是作为评论。

标签: java static


【解决方案1】:

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

【讨论】:

  • 谢谢,这是真的,我重构了我的代码以减少对静态的使用,我发现我只在 2 个类中使用了一些静态,所以现在我正在传递它们,这已经代码更好。
【解决方案2】:

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

Link

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

【讨论】:

    【解决方案3】:

    你说:

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

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

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

    【讨论】:

    • 你能说得更具体一点吗?为什么这不是一个好的设计?它对我有很大的好处,现在我可以引用像 OPEN_BUTTON.disable() 这样的按钮,而不是像 openButton.setDisabled(true) 这样的按钮,因为我向枚举添加了一个方便的方法。在我将按钮放在数组中之前,因为我有很多,所以我将它们称为按钮 [1] 等,这使我的代码不可读。我还不断添加新按钮并更改它们,所以这会更容易。我在枚举中有几个方便的方法,上面是一个简单的例子,但我也有一些复杂的。
    • @JavaMonkey22:为什么不简单地创建一个 GUI 视图类呢?从 Control 更改 View 组件的状态有什么困难?为什么你需要枚举呢?您看起来正在尝试使用枚举来创建全局变量,但这不是它们的用途。
    • @JavaMonkey22:JavaFx 不允许 MVC 模式吗?
    • 这个答案只是批评,没有太多道理。我们可以看一个 View 类的例子吗?
    • @JavaMonkey22 您可以通过在 MyFancyButton 类中使用静态变量来执行相同的“在与方法相同的位置进行实例化”而不会滥用枚举,但我仍然不会。按钮属于其他东西;例如一个窗口或对话框、一个工具栏等,也许一个事件处理程序可以通过一个按钮和一个菜单以及一个三指滑动到右上角,甚至检测到的温度的变化来调用。一个按钮也可以(可能)添加到多个 UI 小部件中。分开你的顾虑;这就是为什么 Hovercraft 关于 GUI View 类的建议是有道理的。
    猜你喜欢
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 2010-12-05
    相关资源
    最近更新 更多