在Java中的方法内部创建类的实例的范围

时间:2018-07-18 10:28:07

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

任何人都可以向我解释从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对象,浪费资源或该函数完成后该对象消失了吗?

谢谢

3 个答案:

答案 0 :(得分:2)

这没错,但是它不是次优的,DatagramSocket不能作为按需构造目的的轻量级类。这个问题可能会在SE Code Review上获得更好的答案。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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