2012-06-19 32 views
7

Tôi đã trải qua mã số Exchange Web Services Java API và thấy một lựa chọn thiết kế theo cách các nhà phát triển chuyển đối số cho phương thức của họ. Bạn có thể giúp giải thích các lợi ích của kỹ thuật này -Một cách tò mò để chuyển một tham số đến một phương thức

Loại được xử lý bằng phương pháp được bao bọc bởi lớp Generic Wrapper trước khi được chuyển vào phương pháp, ví dụ: nếu phương pháp này hoạt động trên Chuỗi, thông số mới() được chuyển vào phương thức mà Param được định nghĩa như sau

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

Đây là một đoạn mã từ nguồn - Phương thức hoạt động trên đối tượng HttpWebRequest.
Trình gọi tạo ra một cá thể của tham số, tức là bị ràng buộc bởi lớp HttpWebRequest. Sau đó, trường hợp đó được truyền vào phương pháp, như bạn có thể nhìn thấy trong chữ ký phương pháp -

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(); 
} 

Sau đó, tại sao không chỉ vượt qua các đối tượng HttpWebRequest - Các nhà phát triển sử dụng mô hình này lặp đi lặp lại trên tất cả các cơ sở mã mà làm tôi nghĩ rằng có một số lý do chính đáng cho nó. Nhưng tôi không thể thấy được lợi ích ... xin hãy khai sáng.

+0

Bạn có thể trỏ đến một trường hợp như vậy trong github, xin vui lòng? cám ơn! Liên kết – Miquel

+0

nằm trong câu hỏi – bell0

Trả lời

4

Tại lối vào phương thức, cá thể HttpWebRequest được bao bọc được dự kiến ​​là rỗng. Đây là một cách để trả về cá thể bằng một phương tiện khác so với câu lệnh trả về, ngay cả khi có điều gì đó sai trong khi gọi phương thức (nếu một trường hợp ngoại lệ được ném). Mẫu này bằng cách nào đó tương đương với từ khóa out trong C#. Nó cũng có thể được sử dụng để trả về một một trạng thái lỗi đối tượng +:

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

chứ không phải viết:

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

Điều này có ý nghĩa, nó đang chuyển một vùng chứa, có thể được sửa đổi. – Ixx

+0

Nó giúp xác định loại có thể được lưu trữ, như trong bộ sưu tập. – Ixx

+0

Bạn có thể thực hiện nó mà không có trình bao bọc chung, nhưng trong trường hợp đó bạn sẽ phải tạo một thùng chứa chuyên dụng cho từng đối tượng mà bạn muốn sử dụng mẫu đó ... Trừ khi bạn thay 'T' bằng 'Object', nhưng nó sẽ kém an toàn và dễ đọc hơn. – Yanflea

Các vấn đề liên quan