这个Holder<>这是什么?用Java做什么?

时间:2014-09-11 01:52:58

标签: java generics

有人可以解释一下这段代码吗?

public void getSupplierByZipCode(
    @WebParam(name = "zip", targetNamespace = "http://www.webservicex.net/")
    String zip,
    @WebParam(name = "GetSupplierByZipCodeResult", targetNamespace =  "http://www.webservicex.net/", mode = WebParam.Mode.OUT)
    Holder<Boolean> getSupplierByZipCodeResult,
    @WebParam(name = "SupplierDataLists", targetNamespace = "http://www.webservicex.net/", mode = WebParam.Mode.OUT)
    Holder<SupplierDataList> supplierDataLists);

我之前从未在Java中看过Holder。函数中的Holder<Boolean>Holder<SupplierDataList>是什么?他们喜欢输出吗?我需要此功能的供应商数据清单。

1 个答案:

答案 0 :(得分:8)

Holder - 完整的目的是&#34;持有一个值&#34; 同时允许自身的副作用修改(从而改变它的价值&#34;持有&#34;)。

表示包含/&#34;实例&#34;的实例变量(value)值可以重新分配;这用于促进[多个]值如何&#34;返回&#34;在WS中 - 通过显式修改作为参数提供的持有者。 (注意WebParam.Mode.OUT的用法。)

这个&#34;额外的层&#34;是必需的,因为Java总是 Call By Value; Holder然后有效地伪造了指针间接(让我们称之为&#34;引用 - 间接&#34;),就像在C中可能做的那样,这会导致Call By (Object) Sharing语义。

想象:

// Outside WS function - setup parameters and invoke
String zip = "98682";
Holder<Boolean> result = new Holder<Boolean>();
getSupplierByZipCode(zip, result, ..);

// Then inside the function the Holder is modified and a new value
// is assigned to it's value member.
getSupplierByZipCodeResult.value = true;

// And outside again, the mutations are visibile still
if (result.value) {
    // Yay!
}

由于字符串是不可变的,并且zip 包装在Holder中,因此无法更改(或#34;返回&#34; by)WS调用。

另见: