【问题标题】:Static class variables are created when Static methods are being called - Java调用静态方法时创建静态类变​​量 - Java
【发布时间】:2015-01-29 23:13:45
【问题描述】:

我有一个控制器类,它同时具有静态和非静态变量和方法。

public class Controller 
{
    // Model that will be used throughout the program
    private static Model model;
    private static ArrayList<Model> modelList = new ArrayList<Model>();

    // User Views
    private static OpenProgramView initialView = new OpenProgramView();
    private DriverProfileView driverProfileView;
}

我还需要一个静态方法,以便其他类可以在没有控制器实例的情况下访问它。以下是对该方法的调用:

int askYear = Controller.getModel().getYear();

我遇到的问题是,当我使用前一行代码时,它似乎调用了私有静态对象的新实例 - OpenProgramView。我知道这一点,因为它在测试期间不应该弹出。我还将其他视图从非静态更改为静态,看看会发生什么,当我使用静态方法时它们也会弹出,但非静态视图没有弹出。

我的问题 - 为什么会这样?似乎当我调用静态方法时,它正在为控制器中的所有静态类变量创建一个新实例,并且正在创建一个问题。

编辑:

我没有说明这只发生在我测试这个特定的 sn-p 代码时。当这个问题发生时我还没有创建一个Controller对象,因此我第一次接触Controller类是调用静态方法。

当我在测试模式下运行程序并实际将其用于功能目的时 - 在创建程序时已经创建了一个 Controller 对象,因此,一旦我调用静态方法,这个问题就不会发生,因为这不是我第一次“接触”课堂。感谢您的帮助。

【问题讨论】:

  • 了解 Java 类中的静态初始化
  • 这个问题应该不会出现可能你在getModel静态方法中做了其他你没有显示的事情,从而产生了问题。
  • 请添加更多描述。

标签: java model-view-controller static controller


【解决方案1】:

这是因为第一次接触类(调用方法、访问字段或创建对象)时,所有静态字段都会被初始化。 p>

这是由 Java 语言规范保证的,你不能做太多事情:

  • 要么将修饰符更改为非静态,要么
  • 懒惰地初始化你的视图

【讨论】:

  • 是的,理论很好,但 OP 的问题不同:似乎当我调用静态方法时,它正在创建所有静态类变量的新实例跨度>
  • @LuiggiMendoza:仔细阅读答案,他是正确的。静态变量与 .class 实例本身相关联。当类加载器第一次加载一个类时,所有的静态字段都将被初始化。这就是为什么你永远不应该依赖静态来连接你的东西的部分原因——初始化顺序可能会把事情搞得一团糟。请改用 Guice 或 Spring 等依赖注入框架。
  • @Gergely 这就是我说好理论的原因,但这并没有为问题提供真正的解决方案。这只是证实了 OP 的问题在其他地方。一个解决方案是:将这个静态元素移到控制器之外或类似的东西。 AFAICS,这只是一个很长的评论,而不是答案。
  • @LuiggiMendoza 问题的字面意思是“为什么会这样?”。答案解释了为什么会这样。
猜你喜欢
  • 2019-03-10
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
相关资源
最近更新 更多