【问题标题】:The Scope of Creating an instance of a class inside a method in javajava中方法内创建类实例的作用域
【发布时间】:2018-07-18 10:28:07
【问题描述】:

任何人都可以向我解释从 java 中的方法内部的类创建对象的范围,这是一种不好的方式并浪费资源还是正常的?程序正在运行,但我不确定这一步:

/**
 * Sending Packets Method
 * @param message-the message we want to send to the client side
 * @param IP-in InetAddress format
 * @param Port-in integer format
 * @return Null
 */
public static void send(String message,InetAddress IP,int Port){
    byte [] buffer=message.getBytes();
    DatagramPacket datagrampacket=new DatagramPacket(buffer,buffer.length,IP,Port); 
    datagrampacket.setPort(20002);
    try {
        DatagramSocket datagramSocket=new DatagramSocket();
        datagramSocket.send(datagrampacket);
        datagramSocket.setReuseAddress(true);
        datagramSocket.close();
    } catch (SocketException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在这种情况下,我每次调用函数时都会创建一个新的DatagramSocket对象并浪费资源或函数完成后对象消失?

谢谢

【问题讨论】:

  • “从类创建对象”的范围?您是指可以使用变量的范围吗?这取决于它的声明位置。
  • 但是,是的,在这段代码中,每次调用此方法时都会创建一个新的 DatagramSocket 实例(java 没有函数),它确实会在终止时为 GC 做好准备方法。
  • 这并不理想,不。您会想要打开套接字并保持打开状态。打开 IO 套接字确实相当昂贵...
  • 谢谢...我每隔几分钟从主类调用一次发送函数,该函数会创建“DatagramSocket”的对象....这样可以吗?
  • @KamelK 它会起作用,但它是否“OK”是另一回事。如果您在应用程序启动时创建一个实例并继续重复使用该实例,而不是不断地创建新实例,这可能会(很多)更好。基本上,您正在丢弃您的系统资源

标签: java object scope object-lifetime object-construction


【解决方案1】:

这没有错,但它是次优的,DatagramSocket 不符合按需构建的轻量级类的条件。这个问题在SE Code Review 上可能会得到更好的答案。

  • datagramSocket 设为类的属性。
  • 从方法中删除静态。
  • 在此类的构造函数或调用类中实例化套接字并传递给构造函数。
  • 您的参数变量“端口”应为“端口”。
  • 您的代码忽略了端口参数并将套接字硬编码为 20002。
  • 了解distinction between variable lifetime and scope

【讨论】:

    【解决方案2】:

    范围将是对象的声明。要在函数中创建对象,这取决于您的要求,如果要重用该对象,则可以在类级别声明该对象并将该类设为单例(如使用数据库存储库)并在构造函数中初始化它或一些初始化方法。如果您要求每个方法调用都应该有新对象,那么您应该在方法级别创建。

    【讨论】:

    • 对不起,这不是答案。答案需要证据、支持,而不是意识流。
    【解决方案3】:

    由于您没有将对象返回给任何实例变量,因此当方法结束时没有指向该对象的变量,因此可以对它进行垃圾收集。您无法知道 gb 何时会运行或是否会运行。这只是说你不能假设方法结束后对象就会消失

    【讨论】:

    • 对不起,这不是答案。答案需要证据、支持,而不是意识流。此外,这还不足以回答有关编程的问题——“消失”是什么意思?
    • 问答作者问“函数完成后对象消失了吗?”
    • 是的,作者是学生,你是老师。第 1 步将解释什么是作用域,第 2 步是什么符合 GC 条件,第 3 步解释这意味着“可见性”与“删除”不同 - gc。第 4 步,用一个很好的例子将它们联系在一起。一个糟糕的问题永远不会成为写一个糟糕答案的借口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2018-11-23
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    相关资源
    最近更新 更多