gpt4 book ai didi

java - 为什么 SocketChannel 是抽象的?

转载 作者:行者123 更新时间:2023-12-01 18:09:05 25 4
gpt4 key购买 nike

我正在编写一个基于NIO的套接字服务器。

我认为创建一个扩展 NIO 的 SocketChannel 类的类是一个聪明的主意,这样我就可以直接在套接字对象中存储自定义信息。

使用java.net.Socket这会很容易:

public class Session extends Socket {
private Long created = System.currentTimeMillis();
}

但是我不能用 java.nio.channels.SocketChannel 做类似的事情,因为它是一个抽象类。如果我想扩展SocketChannel,我需要编写一堆方法。

据我所知,抽象类无法实例化,因此像 ServerSocketChannel.accept() 这样的方法实际上必须返回一个扩展 SocketChannel 的具体类。如果是这样,这个类叫什么?如果不是,为什么这个类是抽象的?

最佳答案

在这种情况下,您可以使用装饰器模式。

public class Session{

private SelectableChannel channel;
private Long created = System.currentTimeMillis();

public Session(SelectableChannel channel){
this.channel = channel;
}

public <T>T getChannel(){
return (T)channel;
}

public long getWhenCreated(){
return created;
}
}

你可以像这样使用它。

Session session = new Session(DatagramChannel.open());
Session session2 = new Session(SocketChannel.open());

DatagramChannel datagramChannel = session.getChannel();
SocketChannel socketChannel = session2.getChannel();

关于java - 为什么 SocketChannel 是抽象的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34231600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com