我正在使用 原始套接字(RAW sockets) 实现一个 正确认证和重传(Positive Acknowledgement and Retransmission) 传输协议,这种情况下需要 SocketImpl 的子类。在实现 accept
方法时,我需要类似以下的东西:
protected void accept(SocketImpl s) {
...
s.copy(socket);
}
在这里,socket
是一个已经计算好的 SocketImpl
对象,需要将它复制到一个已初始化的 SocketImpl
对象 s
中。也就是说,我需要一个可变拷贝方法 s.copy(socket)
,将源 socket
复制到目标 s
中。我知道有 Object clone()
方法,但它返回一个新对象,而我需要改变 s
。
顺便说一句,有些人认为,在这种情况下改变参数 s
是一种糟糕的设计。这不仅是 Java 标准库中的唯一例子。 ServerSocket
类的 implAccept(Socket s)
也是一个例子。但这就是 Sun/Oracle 工程师的设计。我想知道为什么这是一个糟糕的设计。
乍一看,提供一个通用的浅拷贝 target.copy(source)
似乎有些意义,其中 target = souce.clone()
等价于 target = new TheClass(); target.copy(source)
;但由于它不存在(可能有充分的理由,请解释),唯一的办法是编写一个自定义的按字段复制方法。
我是对的吗?谢谢。
SocketImpl
(或任何套接字)是相当不寻常的事情。 - Victor Sorokin