我已经阅读了这篇文章,所以我知道应该如何避免静态变量,它们不是面向对象的,它们就像全局变量等。
但这是我的问题,希望不是重复: 我有一些私有类变量,许多方法使用和传递将是乏味的。我正在谈论的课程是我的主要课程, 所以它的唯一实例将是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() {
//这就是我想拥有事件处理程序的地方......
答案 0 :(得分:4)
你说:
我正在使用JavaFx并且我正在将我的按钮变成枚举,并且我想在枚举中添加ActionEvent(单击)处理程序,所以它在一个地方整齐地放置。处理程序需要访问类变量。
这不是一个好的设计,不是静态变量的原因,也是枚举的误用。你正在通过这种设计抛弃OOP的所有好处,所以我敦促你不要这样做。请注意,如果/当您更新或修改代码时,您将经常更改GUI组件,并且枚举应该(几乎)永远不会更改。它们应该代表你逻辑的不变基石。它们不应该用于当前按钮状态更改的对象。
我还建议在这里使用单例模式,因为不需要将它用于GUI组件(事实上,单例与枚举非常相似)。为什么不简单地创建一个View类?
答案 1 :(得分:2)
如果你发现你经常传递相同的数据,那么在我看来,数据可能具有一定的相关性 - 可能通过将数据封装到某种价值对象中,你不需要有效地使用全局数据数据?
答案 2 :(得分:-1)
在单个类加载器中,静态字段始终是共享的。要将数据显式地定位到线程,您需要使用类似ThreadLocal的工具。
因此,如果您在ThreadLocal中使用静态,那么您的应用的多个实例就不会出现问题。