【问题标题】:What's the point of instantiating an object and not assigning it to a variable in Java?实例化一个对象而不将其分配给 Java 中的变量有什么意义?
【发布时间】:2012-07-30 12:06:29
【问题描述】:

当您不将结果对象分配给引用时,new 关键字有什么用?

这里是示例。

public static void main(String[] args) {ample.
    Display display = new Display();

    new SWTApp(display);

    display.dispose();
}

【问题讨论】:

    标签: java


    【解决方案1】:

    在您的情况下,构造函数很可能有副作用(在线程中启动应用程序?)并且您只对这种副作用感兴趣。

    将其视为调用方法的丑陋方式。

    【讨论】:

    • 我不认为它会在不同的线程中 - 否则我们最终会在显示器完成之前处理掉它。否则它可以启动一个新线程,然后阻塞当前线程......
    • 考虑到上面代码的丑陋,如果dispose() 实际上等待由SWTApp 启动和注册的线程,我不会感到太惊讶,但是是的,阻塞构造函数看起来像这里的更明智的方法.
    • 这是有问题的代码:zetcode.com/gui/javaswt/introduction 构造函数是阻塞的,你是对的。
    【解决方案2】:

    大概在这种情况下,SWTApp 的构造函数实际上会运行应用程序,直到它关闭。对我来说,这听起来不是一个很棒的设计,但语言中没有任何东西可以真正阻止它。

    【讨论】:

      【解决方案3】:

      不将结果对象分配给引用时,new 关键字有什么用

      当你想调用某个类的某个方法只调用一次并且不想想要存储对象的引用以供将来使用。在下面的示例中,我是只对调用Display类的方法showMessage()感兴趣。

      public class XYTest {
      
          public static void main(String[] args) {
              new Display().showMessage();
          }
      }
      
      class Display {
      
          public void showMessage() {
              System.out.println("Hey! I am here.");
          }
      }
      

      【讨论】:

        【解决方案4】:

        如果您只想创建一个新对象但不需要为该对象设置任何内容,则无需将其分配给变量。

        【讨论】:

          【解决方案5】:

          在 Java 中,new 关键字用于创建对象。现在创建对象时会发生什么,JVM 为所有成员变量和方法分配内存,并调用构造函数。在正常情况下,您希望将变量引用存储到某个对象,但如果您知道构造函数已经完成了对新对象的任何操作,则可以进行您提到的初始化(尽管这是一个非常糟糕的做法)

          例如

          public class PrintFile{
          public PrintFile(String fileName)
          {
          //code to print the file on printer or file system
          }
          }
          

          现在我们可以简单地说

          new PrintFile(filetoprint);
          

          不需要保存对象引用,因为工作是在构造函数本身中完成的。

          【讨论】:

            【解决方案6】:

            标准小部件工具包 (SWT) 是用于 Java 编程语言的图形小部件工具包。

            无论平台如何,图形应用程序都有离散的入口点,这些入口点创建可查看的资源和队列机制以在这些资源之间触发事件并因此在应用程序中调用控制器对象。 (例如按钮动作事件、窗口打开事件)

            您不需要保存对这些对象之一的引用这一事实并不重要,因为像这样的构造函数通常是您不需要直接处理的应用程序入口点的表示。

            构造函数不会操作您传递给它的对象,它接受它作为在上下文中执行应用程序的起点,可能使用您传入的初始状态作为初始窗口或初始配置。

            下面是你好奇的构造函数代码:

            public SWTApp(Display display) {
            
                Shell shell = new Shell(display);
                shell.setText("Center");
                shell.setSize(250, 200);
            
                center(shell);
            
                shell.open();
            
                while (!shell.isDisposed()) {
                  if (!display.readAndDispatch()) {
                    display.sleep();
                  }
                }
            }
            

            构建您的应用程序,不要担心这一点,它不是与用户相关的实例,而是应用程序入口点。顺便说一下,这个图形应用程序的初始构造看起来几乎与几乎任何语言的图形应用程序的所有其他入口点一样。

            干杯!

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-06-18
              • 2017-02-11
              • 1970-01-01
              相关资源
              最近更新 更多