有人可以解释一下这段代码吗?
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>
是什么?他们喜欢输出吗?我需要此功能的供应商数据清单。
答案 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调用。
另见: