zeroc Ice方法参数均为“值传递”

引言:

    在使用Zeroc Ice做java侧开发的时候,会看到大量传引用的实例,但Ice并不支持这种“既in又out”的参数传法(跟网络传输特点有关)。

    具体说法请参看官方文档:
    http://www.zeroc.com/doc/Ice-3.3.0/manual/Slice.5.10.html(->4.10.1 Parameters and Return Values)

正文:

一、假设:

    1,有这个消息对象(用来传递):
//Snp_A, code snippet A
public class Message {

    private static final long serialVersionUID = 7186346309330010649L;

    public String id;
    public String content;
}

    2,有这个操作接口(用来整理消息。比如滤掉消息中的敏感字符):
//Snp_B, code snippet B
public interface MessageManager {

    public void trimMessage(Message msg);

    public Message getTrimedMessage(Message msg);
}


二、分析

    Snp_B片断中的两个方法的参数均为引用传递。其中trimMessage(msg)是将msg直接就地整理,而getTrimedMessage(msg)是将传入的msg整理完后以返回值传出——两者都存在参数“in & out”。非常常见。(读过《代码整洁之道》的朋友别忙喷我,第一个方法只是演示这么有这么个情况)

    两个都可以实现效果,但加入ICE以后,如果做为Servent发布,第一种就不成了。原因是:
引用

**TIP:
***from   :http://www.zeroc.com/doc/Ice-3.3.0/manual/Slice.5.10.html
***to view:4.10.1 Parameters and Return Values

...
By default, parameters are sent from the client to the server, that is, they are input parameters. To pass a value from the server to the client, you can use an output parameter, indicated by the out keyword.
...

    直接给trimMessage(msg)判了“死刑”!

三、结论

    鉴于以上情况,遇到这样的方法,可考虑以下三种方式来解决(按建议的优先级排列):

    1,将void trimMessage(msg)改型为 Message getTrimedMessage(msg);

    2,额外定义接收参数。例如:void trimMessage(msg, returnedMsg)。returnedMsg设定为“out”参数。Slice定义如下:
void trimMessage(Message msg, out Message returnedMsg);

    其中returnedMsg将被包装为*Holder类型通过(Message)(returnedMsg.value)拿到整理后的msg。另外msg参数前加上in与不加一样,因为默认为in。

    3,如果Message较复杂,可能考虑再包装一层使用setter/getter方式实现传入传出。




   
   

猜你喜欢

转载自zhaoningbo.iteye.com/blog/1152287