Sto scrivendo un server come qui di seguitojava - Come creare un'istanza di tipo generico 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();
}
}
}
Ma nel metodo handleNewConnectionRequest(...)
, non posso creare un'istanza di T in quanto non è in realtà una classe . Inoltre, non è possibile utilizzare il metodo menzionato here poiché voglio passare l'istanza socket
in modo che il gestore richieste possa ottenere OutputStream
e InputStream
su socket
.
non è possibile fare un server generico come sopra e hanno diversi gestori di protocollo ad esempio
public class HttpRequestHandler extends RequestHandler {
...
}
public class FtpRequestHandler extends RequestHandler {
...
}
public class SmtpRequestHandler extends RequestHandler {
...
}
e poi li usano come qui di seguito
Server<HttpRequestHandler> httpServer = new Server<HttpRequestHandler>();
Server<FtpRequestHandler> ftpServer = new Server<FtpRequestHandler >();
Server<SmtpRequestHandler> smtpServer = new Server<SmtpRequestHandler >();
+1. Oppure fai in modo che il server usi una RequestHandlerFactory e chiedi a questa fabbrica di creare un RequestHandler ogni volta che il server ne ha bisogno. –
@ JBNizet Ehi, ancora meglio! Ho trovato classi astratte/implementazioni e parametri di tipo per essere veramente buoni amici per il design OO. –