2011-10-28 15 views
9

のインスタンスを作成するために、私はjavaの - どのようにジェネリック型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(); 
     } 
    } 
} 

以下のようにサーバーを書いています。しかし、それは実際にはクラスではないようhandleNewConnectionRequest(...)方法では、私はTのインスタンスを作成することはできません。また、私がsocketインスタンスを渡して、socketのリクエストハンドラがOutputStreamInputStreamになるように、hereというメソッドを使用することはできません。


は、私は上記のような一般的なサーバーを作ることはできませんし、異なるプロトコルハンドラが

Server<HttpRequestHandler> httpServer = new Server<HttpRequestHandler>(); 
Server<FtpRequestHandler> ftpServer = new Server<FtpRequestHandler >(); 
Server<SmtpRequestHandler> smtpServer = new Server<SmtpRequestHandler >(); 

答えて

5

はたぶん、さまざまなハンドラのタイプにふさわしい異なるServerサブクラスを作ります。一つの例:

public class HttpServer extends Server<HttpRequestHandler> { 

    protected HttpRequestHandler wrapSocket(Socket socket) { 
     return new HttpRequestHandler(socket); 
    } 

} 

そしてそうのようにサーバーを適応:

public abstract class Server<T extends RequestHandler> { 

    protected abstract T wrapSocket(Socket socket); 

    protected void handleNewConnectionRequest(Socket socket) { 
     try { 
      executorService.submit(wrapSocket(socket)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

だけの思考...

+2

+1。または、サーバーにRequestHandlerFactory を使用させ、サーバーが要求するたびにこの工場にRequestHandler を作成するよう依頼します。 –

+0

@JBNizetねえ、さらに良い!私は抽象クラス/実装とOOのデザインのための本当に良い友達になるように型パラメータを見つけました。 –

0

の下にあなたが直接それを行うことはできませんようにそれらを使用し、その後

public class HttpRequestHandler extends RequestHandler { 
    ... 
} 

public class FtpRequestHandler extends RequestHandler { 
    ... 
} 

public class SmtpRequestHandler extends RequestHandler { 
    ... 
} 

を例えばとしていますJavaのジェネリックスのように。 getClass()でRequestHandlerの実際のクラスオブジェクトを取得した場合、Reflectionを使用できます。あなたは、コンストラクタ内のアイテムのクラスを節約しようとし、このようにヘルパーメソッドを書くことができます:

Save the class object (in constructor for example): 
this.clazz = requestHandler.getClass() 

Then create new object of same class: 
E instantiate(Class<E> clazz) 
{ 
    return clazz.newInstance(); 
} 
9

あなたはクラスのインスタンスが必要になります。総称タイプTでは不十分です。だから、やる:

class Server <T extends RequestHandler> { 
    Class<T> clazz; 
    public Server(Class<T> clazz) { 
     this.clazz = clazz; 
    } 

    private T newRequest() { 
     return clazz.newInstance(); 
    } 
} 
1

あなたはしないでください。それは意味をなさない。この場合、私はおそらくジェネリックを避けるでしょう。プレーンな古いインターフェイスまたは抽象クラスは仕事をします。抽象ファクトリメソッドを使用して抽象サーバーを作成することができます。

abstract class Server { 
    abstract protected RequestHandler newRequest(Socket socket); 
    ... same as before 
} 
+0

+1これは最も理にかなっているようで、読みやすいようになっています。私はここにFactoryパターンから得るべきことがたくさんあるとは思わない。言語構造は、行く方法です。 –

0
/* =================|Cassandra to Java Connection|===================== */ 
package demo_cassandra_connection; 

import com.datastax.driver.core.Cluster; 
import com.datastax.driver.core.Row; 
import com.datastax.driver.core.Session; 

public class java_to_cassandra_connection 
{ 
    public static void main(String[] args) 
    { 
     com.datastax.driver.core.Session ses; 
     Cluster cluster= 
     Cluster.builder().addContactPoints("54.191.46.102", 
     "54.149.32.12", "54.191.43.254") 
     .withPort(9042).withCredentials("cassandra","cassandra").build(); 
     ses = cluster.connect(); 
     Session session = (Session) cluster.connect(); 
     String cqlStatement = "SELECT * FROM testapp.user"; 
     for (Row row : ((com.datastax.driver.core.Session) 
     session).execute(cqlStatement)) 
     { 
      System.out.println(row.toString()); 
     } 

    } 
} 
関連する問題