在 java 中的方法内创建 class 实例的范围

The Scope of Creating an instance of a class inside a method in java

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

/**
 * 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对象,浪费资源或者函数结束时对象消失?

谢谢

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

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

这没有错,但它不是最优的,DatagramSocket 不符合按需构建目的的轻量级 class。这个问题可能会在 SE Code Review.

上得到更好的答案
  • datagramSocket 设为 class 的 属性。
  • 从方法中删除静态。
  • 在此 class 的构造函数或调用 class 中实例化套接字并传递给构造函数。
  • 你的参数变量 'Port' 应该是 'port'.
  • 您的代码忽略端口参数并将套接字硬编码为 20002。
  • 了解distinction between variable lifetime and scope