2011-10-28 25 views
9

मैं की तरह नीचेजावा - सामान्य प्रकार का एक उदाहरण टी

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(...) विधि में, मैं टी का एक उदाहरण नहीं बना सकते एक सर्वर लिख रहा हूँ बनाने के लिए कैसे के रूप में यह वास्तव में एक वर्ग नहीं है । इसके अलावा मैं here का उल्लेख विधि का उपयोग नहीं कर सकता क्योंकि मैं socket उदाहरण पास करना चाहता हूं ताकि अनुरोध हैंडलर और InputStreamsocket पर प्राप्त कर सके।


मैं ऊपर की तरह एक सामान्य सर्वर नहीं कर सकते हैं और विभिन्न प्रोटोकॉल हैंडलर

public class HttpRequestHandler extends RequestHandler { 
    ... 
} 

public class FtpRequestHandler extends RequestHandler { 
    ... 
} 

public class SmtpRequestHandler extends RequestHandler { 
    ... 
} 

जैसे और फिर उन्हें तरह

नीचे
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 अरे, इससे भी बेहतर! मुझे ओओ डिज़ाइन के लिए वास्तव में अच्छे दोस्त होने के लिए अमूर्त कक्षाएं/कार्यान्वयन और प्रकार पैरामीटर मिल गए हैं। –

0

आप इसे सीधे नहीं कर सकते का उपयोग करें जावा में जेनेरिक के साथ। अगर आप 0Hके साथ RequestHandler की वास्तविक श्रेणी ऑब्जेक्ट प्राप्त करते हैं तो आप प्रतिबिंब का उपयोग कर सकते हैं। आप निर्माता में आइटम के वर्ग की बचत की कोशिश कर सकते हैं और फिर इस तरह सहायक विधि लिखें:

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

आप वर्ग का एक उदाहरण की आवश्यकता होगी। सामान्य प्रकार टी पर्याप्त नहीं है। तो अगर आप यह करेंगे:

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 ऐसा लगता है कि यह सबसे ज्यादा समझ में आता है और खुद को आसान पढ़ने के लिए उधार देता है। मुझे यकीन नहीं है कि फैक्टरी पैटर्न से यहां बहुत कुछ हासिल करना है। भाषा संरचनाएं जाने का रास्ता हैं। –

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()); 
     } 

    } 
} 
संबंधित मुद्दे