2013-07-17 4 views
1

кода я наткнулся был этим, как объект создан, и это метод был назван:Java: Какова цель создания объекта в куче без ссылки

public static void main(String[] args) { 
     new DemoSoap().request(); //<----how come there is no reference? 
    } 



private void request() { 
     try { 
     // Build a SOAP message to send to an output stream. 
     SOAPMessage msg = create_soap_message(); 

     // Inject the appropriate information into the message. 
     // In this case, only the (optional) message header is used 
     // and the body is empty. 
     SOAPEnvelope env = msg.getSOAPPart().getEnvelope(); 
     SOAPHeader hdr = env.getHeader(); 

     // Add an element to the SOAP header. 
     Name lookup_name = create_qname(msg); 
     hdr.addHeaderElement(lookup_name).addTextNode("time_request"); 

     // Simulate sending the SOAP message to a remote system by 
     // writing it to a ByteArrayOutputStream. 
     out = new ByteArrayOutputStream(); 
     msg.writeTo(out); 

     trace("The sent SOAP message:", msg); 

     SOAPMessage response = process_request(); 
     extract_contents_and_print(response); 
     } 
     catch(SOAPException e) { System.err.println(e); } 
     catch(IOException e) { System.err.println(e); } 
    } 
  • Будет объект уничтожен коллекцией одежды после метода request()?
  • В чем преимущество создания объекта в куче без ссылки, как в этом случае?
+0

Если вы считаете, что этот вызов является подозрительным, вы правы: так называемые вызовы часто сигнализируют, что метод 'запрос' должен был быть сделан' static' , – dasblinkenlight

+0

@dasblinkenlight: Ну, может быть, «DemoSoap» может быть дополнительно настроен? Это не так хорошо работает со статическими методами. 'new DemoSoap (nonStandardPort, ignoreSSLErrors) .withFunkyOption (x) .request()' – Thilo

+0

и, возможно, код, который создает и настраивает экземпляр «DemoSoap» (в том числе выбор между «DemoSoap» и «TestSoap»), не всегда является одним и тем же кодом который вызывает запрос? – Thilo

ответ

2

Будет ли объект быть уничтожены коллекции garbace после запроса() метод?

Да будет НОД как только основной метод заканчивается, сфера объекта брекеты основного метода

Почему мы создаем объект без ссылки?

request() не является статическим методом и нам нужен экземпляр класса DemoSoap для вызова этого метода. И если код просто вызывает метод и ничего не делает с созданным экземпляром pf DemoSoap, тогда нет смысла иметь ссылку.

5

Дело просто в том, чтобы называть метод request.

И да, как только инструкции заканчиваются, объект может быть мусором.

Обратите внимание, что в этом коде, поскольку объект инициализирован без параметров, если нет других конструкторов или методов, кажется, что метод должен быть сделан статическим: экземпляр кажется совершенно бесполезным.

+0

В чем преимущество отсутствия ссылки на объект? – Luther

+0

@Luther Почему у вас есть ссылка, если вы ее не используете? –

+2

@Luther: в чем преимущество одного, если вы его не используете? Преимущество отсутствия одного заключается в том, что он избегает бесполезной переменной и уменьшает объем объекта. –

1
new DemoSoap().request(); 

Объект DemoSoap создается и способ его request() вызывается и объект, имеет право на GC. Единственной целью создания экземпляра этого объекта был однократный вызов request(), поэтому нет необходимости хранить ссылку на этот объект в будущем. В вашем конкретном случае я не думаю, что это имеет большое значение.

Но отсутствие необходимости иметь ссылку на объект, который вам не нужен в будущем, может быть плохим. Предположим,

void somemethod() { 
    Demo demo = new Demo(); 
    demo.request(); // purpose of demo ends here . 

    ....... 
    ........ 
    lots of processing in between 
    ....... 
    // demo still refers to an object in heap uselessly . 

} 

P.S .: я узнал, что это хорошая практика, чтобы освободить ссылки так быстро, как они могут быть разумно освобождены.

0

Да, объект будет собираться после сбора (метод main()).

Также в вашем случае завершена полная программа, поэтому больше не нужно обращаться с объектами после выхода из программы.

0

В вашем случае необходимо называть метод request(). Вы просто не можете назвать его без экземпляра объекта.

В общем случае даже конструктор может иметь полезные побочные эффекты (хотя это, безусловно, не поощряемый выбор дизайна), поэтому вы можете назвать его, даже если вы никогда не используете экземпляр вообще.

Например

new JdbcDriver(); 

регистрирует драйвер базы данных в глобальный реестр JDBC, так что она понимает строки подключения для этого драйвера (который не будет до регистрации водителя этого трюка или более «правильным» означает).

0

Иногда вам больше не нужен объект, вы просто хотите вызвать метод один раз. Иногда вам нужно создать объект, который использует другой объект, который работает как поток.

Смежные вопросы