【问题标题】:Java: instance really better than static?Java:实例真的比静态好吗?
【发布时间】:2016-12-03 11:50:01
【问题描述】:

所以我有一些课程,例如MainWindowMenuPanelGamePanelGameEnginePlayer 等等......

我的问题是,虽然我已经阅读了很多关于静态与实例的信息,但应该更推荐使用它,根据我的其中一条线如下所示: MainWindow.getGamePanel().getPlayer1().getName().toLowerCase().compareTo(...);

MainWindow.getGamePanel().getLabels()[0].getIcon();

您是否认为这是一个很好的做法,尽量不使用每个对象都有不同属性且事物没有泛化的静态,而不是声明 labelsplayersnamesstatic 并拥有更容易重用和阅读的代码?

我的想法是我使用这些长代码,因为在Player中创建GamePanel(视觉类)对象肯定会很尴尬@(更像是一个逻辑) 类例如。所以我只是创建了MainWindow 中每个类的一个对象(不是主类,只是 JFrame 类) 并为每个类创建了static getters

【问题讨论】:

  • 我很难说出你在描述什么......听起来你的代码结构很奇怪。 MainWindow.getGamePanel().getPlayer1().getName().toLowerCase().compareTo(...); 对我来说看起来很可疑......看起来你仍然在用静态引用做所有事情,你只有一个返回特定实例的顶级静态方法。不看更多代码很难判断,但我敢打赌,事情可以重新构造,这样你就根本不需要那些长的访问链。
  • MainWindow.getGamePanel().getPlayer1().getName().toLowerCase().compareTo(...); 这样的行也可能是由糟糕的设计引起的,而不是只是使用实例。

标签: java class oop object static


【解决方案1】:
MainWindow.getGamePanel().getPlayer1().getName().toLowerCase().compareTo(...);

这是对Law of Demeter 的典型违反,有时表达为“问,不要看”。调用这些 getter 的类对程序的整体结构了解太多,这使得它变得脆弱。如果任何这些类之间的关系发生变化,所有依赖这些链式 getter 的代码都会中断。

“问,不看”背后的想法是,调用这些 getter 以获取玩家名称的类应该要求玩家名称作为构造函数参数。如果这导致构造函数具有大量参数,则该类可能违反了Single Responsibility Principle

【讨论】:

    猜你喜欢
    • 2013-02-20
    • 2011-02-06
    • 1970-01-01
    • 2018-02-18
    • 2011-09-27
    • 2018-04-05
    • 2023-04-02
    • 1970-01-01
    • 2015-05-31
    相关资源
    最近更新 更多