Tôi viết một máy chủ như dưới đâyjava - Làm thế nào để tạo ra một thể hiện của loại generic T
public class Server<T extends RequestHandler> {
public void start() {
try{
this.serverSocket = new ServerSocket(this.port, this.backLog);
} catch (IOException e) {
LOGGER.error("Could not listen on port " + this.port, e);
System.exit(-1);
}
while (!stopTheServer) {
socket = null;
try {
socket = serverSocket.accept();
handleNewConnectionRequest(socket);
} catch (IOException e) {
LOGGER.warn("Accept failed at: " + this.port, e);
e.printStackTrace();
}
}
}
protected void handleNewConnectionRequest(Socket socket) {
try {
executorService.submit(new T(socket));
} catch (IOException e) {
e.printStackTrace();
}
}
}
Nhưng trong phương pháp handleNewConnectionRequest(...)
, tôi không thể tạo ra một thể hiện của T vì nó là thực sự không phải là một lớp . Ngoài ra tôi không thể sử dụng phương pháp được đề cập here vì tôi muốn chuyển thể hiện socket
để trình xử lý yêu cầu có thể nhận được OutputStream
và InputStream
trên số socket
.
Tôi không thể làm cho một máy chủ chung chung như trên và có xử lý giao thức khác nhau ví dụ như
public class HttpRequestHandler extends RequestHandler {
...
}
public class FtpRequestHandler extends RequestHandler {
...
}
public class SmtpRequestHandler extends RequestHandler {
...
}
và sau đó sử dụng chúng như dưới đây
Server<HttpRequestHandler> httpServer = new Server<HttpRequestHandler>();
Server<FtpRequestHandler> ftpServer = new Server<FtpRequestHandler >();
Server<SmtpRequestHandler> smtpServer = new Server<SmtpRequestHandler >();
+1. Hoặc làm cho máy chủ sử dụng RequestHandlerFactory và yêu cầu nhà máy này tạo một RequestHandler mỗi khi máy chủ cần. –
@JBNizet Hey, thậm chí tốt hơn! Tôi đã tìm thấy các lớp/triển khai trừu tượng và các tham số kiểu để trở thành những người bạn thực sự tốt cho thiết kế OO. –