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

Java 我应该为我的主要程序变量使用静态变量吗?,java,static,Java,Static,我读过这方面的文章,所以我知道应该如何避免静态变量,它们不是面向对象的,它们就像全局变量,等等 但这是我的问题,希望不会重演: 我有一些私有类变量,许多方法都使用它们,传递这些变量会很乏味。我说的这门课是我的主要课程, 因此,它的唯一实例将是JVM创建的实例 在这种情况下,这些变量是静态的还是非静态的有什么区别吗?(如果用户多次打开我的应用程序,我将变量设置为静态,他们可能会共享变量并相互混淆?) 我想使用静态,因为我想从枚举内部访问这些变量。谢谢 以下是枚举部分的代码: enum Button

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

但这是我的问题,希望不会重演: 我有一些私有类变量,许多方法都使用它们,传递这些变量会很乏味。我说的这门课是我的主要课程, 因此,它的唯一实例将是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() {
enum按钮{
打开按钮(“打开文件…”,错误),
更改字体按钮(“更改字体”,false),
装饰按钮(“装饰字体”,正确),
编辑器按钮(“打开编辑器”,错误),
字母表按钮(“打开字母表浏览器”,错误),
CTEST_按钮(“开始辅音测试”,错误),
TESTTYPE_按钮(“选择测试类型…”,错误),
测试按钮(“开始字测试”,错误),
退出按钮(“退出”,错误);
私人按钮库按钮;
按钮(字符串标题、布尔切换){
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 eh){button.setOnMouseClicked(eh);}
ButtonBase getBase(){return button;}
boolean-toggled(){return((ToggleButton)button).isSelected();}
void setToggle(boolean on){((ToggleButton)按钮).setSelected(on);}
void enable(){button.setDisable(false);}
void disable(){button.setDisable(true);}
void setText(字符串文本){button.setText(文本);}
无效单击(){

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

如果你发现你在很多地方传递相同的数据,那么在我看来,这些数据可能有一定的相关性——也许通过将这些数据封装到某种值对象中,你就不需要有效地使用全局数据了atic字段总是共享的。要将数据显式地作用域到线程,您需要使用像ThreadLocal这样的工具

因此,如果您对ThreadLocal使用statics,您的应用程序的多个实例就不会有问题。

您声明:


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

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


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

您的枚举需要如何访问一个非常量程序变量?这似乎是一个不同寻常的设计?我的直觉告诉我,您不应该这样做。通过“主程序”如果你指的是带有main方法的类,那么这个方法应该尽可能短,只用于创建对象并让它们启动和运行,就是这样。我正在使用JavaFx,我正在将我的按钮制作成一个枚举,我想添加ActionEvent(单击)处理程序位于枚举中,因此所有处理程序都整齐地放在一个位置。处理程序需要访问类变量。然后答案很简单:这闻起来很糟糕。枚举应该用于常量,而不是GUI组件。只是不要这样做。很抱歉,错误地尝试插入codeinsert代码作为对主要问题的编辑,而不是作为注释。您能更具体地说,为什么这不是一个好的设计?它对我有很大的好处,现在我可以引用像OPEN_BUTTON.disable()这样的按钮,而不是像openButton.setDisabled(true)这样的按钮,因为我在枚举中添加了一个方便的方法。在我将按钮放入数组之前,因为我有很多按钮,所以我引用它们就像按钮[1],等等,这使我的代码无法阅读。我还不断添加新按钮并对其进行更改,因此这使操作变得更简单。我在枚举中有几个方便的方法,上面是一个简单的示例,但我也有一些复杂的方法。@JavaMonkey22:为什么不简单地创建一个GUI视图类?更改Vi的状态有什么困难控件中的ew组件?为什么需要enum?您似乎试图使用enum来生成全局变量,而这不是它们的用途。@JavaMonkey22:JavaFx不允许MVC模式吗?这个答案只是批评,没有太多理由。我们可以看到View类的示例吗?@JavaMonkey22您也可以这样做“在与方法相同的位置实例化"在
MyFancyButton
类中使用statics不会滥用枚举,但我仍然不会。按钮属于其他类型,例如窗口或对话框、工具栏等,可能一个按钮和菜单以及右上角的三个手指滑动,甚至检测到的温度变化都可以调用单个事件处理程序。a单个按钮也可以(潜在地)添加到多个UI小部件中。分离您的顾虑;这就是为什么Hovercraft建议的GUI视图类是有意义的。谢谢,这是真的,我重构了我的代码以减少静态的使用,我发现我只在两个类中使用了一些静态,所以现在我正在传递它们和这个