2012-06-19 18 views
7

yöntemine geçirmenin ilginç bir yolu Exchange Web Services Java API kodunu geçiyordum ve geliştiricilerin yöntemlerine ilişkin argümanları iletme biçiminde bir tasarım seçimi gördüm. Tekniğin faydalarını açıklamaya yardımcı olabilirsiniz -Bir parametreyi

Yöntem tarafından işlenecek olan yöntem, yönteme geçirilmeden önce bir Jenerik Sarmalayıcı sınıfı tarafından sarılır; yöntem, bir HttpWebRequest nesne üzerinde çalışır - param tanımlandığı gibidir kaynaktan snippet'idir burada

class Param<T> { 
    private T param; 
    public T getParam() { return param; } 
    public void setParam(T param) { this.param = param } 
} 

aşağıdaki şekilde dize, yeni param() yöntemiyle geçirilir.
Arayan, HttpWebRequest sınıfı tarafından sınırlandırılan bir Param örneğini oluşturur.

protected HttpWebRequest emit(OutParam<HttpWebRequest> request) 
throws Exception { 
    request.setParam(this.getService().prepareHttpWebRequest()); 
    OutputStream urlOutStream = request.getParam().getOutputStream(); 
    EwsServiceXmlWriter writer = new EwsServiceXmlWriter(this.service,urlOutStream); 
    this.writeToXml(writer); 
    urlOutStream.flush(); 
    urlOutStream.close(); 
    writer.dispose(); 

    request.getParam().executeRequest(); 
    if(request.getParam().getResponseCode() >= 400) 
    { 
     throw new Exception("The remote server returned an error:("+request.getParam().getResponseCode()+")"+request.getParam().getResponseText()); 
    } 
    return request.getParam(); 
} 

Öyleyse neden HttpWebRequest nesnesi geçemezse - - Eğer yöntem imzası görebileceğiniz gibi Sonra bu örnek, yöntemin geçirilir geliştiricilerin tüm sağlayan kod tabanı üzerinde tekrar tekrar bu modeli kullanın Bunun için iyi bir neden olduğunu düşünüyorum. Ama ben sadece fayda göremiyorum ... lütfen aydınlatın.

+0

lütfen işaret edebilir? Teşekkürler! – Miquel

+0

link – bell0

cevap

4

Yöntem girişinde, sarılmış HttpWebRequest örneğinin boş olması beklenir. Bu yöntem, yöntem çağrısı sırasında bir şey ters giderse bile (örneğin bir istisna atılırsa), döndürme deyiminden başka bir ortalamayla geri dönmenin bir yoludur. Bu model bir şekilde C# out anahtar kelimesine eşdeğerdir. Aynı zamanda bir nesneyi + bir hata durumunu dönmek için kullanılabilir:

bool getGreetings(OutParam<Greetings> greetings) { 
    if (aCondition) { 
    greetings.setParam(new Greetings("Hello"); 
    return true; // everything's fine 
    } 
    return false; 
} 

yerine yazma daha: Eğer github içinde böyle bir örneğine

Greetings getGreetings() { 
    if (aCondition) { 
    return new Greetings("Hello"); 
    } 
    return null; // caller will have to test a null condition to know it the operation was ok 
} 
+0

sorusudur. Bu mantıklıdır, değiştirilebilen bir kaptan geçmektedir. – Ixx

+0

Koleksiyonda olduğu gibi depolanabilecek türü tanımlamanıza yardımcı olur. – Ixx

+0

Gerçekten bir jenerik sarıcı olmadan yapabilirsiniz, ancak bu durumda, böyle bir deseni kullanmak istediğiniz her nesne için özel bir kap oluşturmanız gerekir ... 'T' yerine 'Nesne' ile değiştirmediğiniz sürece, ancak daha az güvenli ve okunabilir olurdu. – Yanflea

İlgili konular