我正在根据RAW套接字实现肯定确认和重传传输协议(protocol),在这种情况下,需要SocketImpl
的子类。当实现accept
方法时,我需要这样的东西:
protected void accept(SocketImpl s) {
...
s.copy(socket);
}
其中
socket
是已计算出的SocketImpl
对象,必须将其复制到已初始化的已初始化 SocketImpl
对象s
。即,我需要一种可变复制方法 s.copy(socket)
,它将源socket
复制到目标s
。我知道存在Object clone()
,但是它返回一个新的Object,我需要对s
进行突变。顺便说一句,有些人认为突变一个参数(在这种情况下为
s
)是 splinter 的设计。这不是Java标准库中的唯一示例。 implAccept(Socket s)
类的ServerSocket
是另一个示例。但这就是Sun/Oracle工程师设计它的方式。我想知道为什么这是一个糟糕的设计乍一看来,提供通用的浅层
target.copy(source)
似乎有些道理,其中target = souce.clone()
等同于target = new TheClass(); target.copy(source)
;但是由于它不存在(可能出于充分的原因,请解释),唯一的方法是编程一个自定义的逐字段复制方法。我对吗?谢谢。
最佳答案
您误解了该方法的用途以及它的工作方式。我已经做了很多次了。提供给SocketImpl
的implAccept()
是用于新接受的套接字,而不是ServerSocket
。因此,您不需要第二份副本。您需要做的就是将此SocketImpl
包装在Socket
或您自己的Socket
派生类中。奇怪的是,甚至提供了一个Socket
构造函数。