जावा विधियों के सामान्य प्रकारों को वापस करने के संबंध में बहुत सारे प्रश्न हैं, लेकिन उनमें से किसी ने भी अब तक मेरी मदद नहीं की है।
तो यहाँ मेरा कोड है:
interface DAO<K, T> {
void insert(T t);
void update(K k, T t);
void delete(K k);
void delete();
T select(K k);
List<T> select();
}
public class CourseDAO implements DAO<String, Course> {
public void insert(Course t) {}
public void update(String k, Course t) {}
public void delete(String k) {}
public void delete() {}
public Course select(String k) {}
public List<Course> select() {}
}
public class StudentDAO implements DAO<Long, Student> {
public void insert(Student t) {}
public void update(Long k, Student t) {}
public void delete(Long k) {}
public void delete() {}
public Student select(Long k) {}
public List<Student> select() {}
}
public enum EntityType { COURSE, STUDENT }
अब मुझे एक फैक्ट्री विधि चाहिए जो EntityType
पैरामीटर स्वीकार करे और पैरामीटर मान के आधार पर CourseDAO
या StudentDAO
का उदाहरण लौटाए।
मैंने सफलता के बिना नीचे दिए गए कोड की कोशिश की:
public <K,T> DAO<K,T> createDAOFactory(EntityType type) {
switch (type) {
case COURSE : return (K,T) new CourseDAO(); break;
case STUDENT : return (K,T) new StudentDAO(); break;
}
return null;
}
क्या कोई इस विधि को लिखने और लागू करने में मेरी मदद कर सकता है ???
चीयर्स,
रोमुअल्डो।
2 जवाब
आप जिस कास्ट की तलाश कर रहे हैं वह (DAO<K,T>)
है। लेकिन आपको एक चेतावनी मिलेगी क्योंकि जेनेरिक टाइप इरेज़र इसे असुरक्षित बनाता है। switch
फ़ैक्टरी में एक और अंतर्निहित जोखिम यह है कि जब आप एक नया EntityType
जोड़ते हैं तो आप संबंधित case
बनाना भूल सकते हैं। एक सुरक्षित विकल्प EntityType
को सामान्य प्रकारों के साथ फिर से परिभाषित करना होगा, और इसे कारखाना होने देना होगा। दुर्भाग्य से, यह उचित एनम के साथ संभव नहीं है, लेकिन आप इसे इस तरह अनुकरण कर सकते हैं:
abstract class EntityType<K, T> {
public abstract DAO<K, T> createDAO();
public static final EntityType<String, Course> COURSE = new EntityType<String, Course>() {
@Override
public DAO<String, Course> createDAO() {
return new CourseDAO();
}
};
public static final EntityType<Long, Student> STUDENT = new EntityType<Long, Student>() {
@Override
public DAO<Long, Student> createDAO() {
return new StudentDAO();
}
};
}
या आप बॉयलरप्लेट को कम करने के लिए लैम्ब्डा का उपयोग कर सकते हैं:
class EntityType<K, T> {
private final Supplier<DAO<K, T>> constructor;
private EntityType(Supplier<DAO<K, T>> constructor) {
this.constructor = constructor;
}
public DAO<K, T> createDAO() {
return constructor.get();
}
public static final EntityType<String, Course> COURSE = new EntityType<>(CourseDAO::new);
public static final EntityType<Long, Student> STUDENT = new EntityType<>(StudentDAO::new);
}
अब, createDAOFactory(EntityType.COURSE)
को कॉल करने के बजाय, आप केवल EntityType.COURSE.createDAO()
को कॉल करेंगे।
शायद आप ऐसा कर सकते हैं?
public class StudentDAO<Long,Student> implements DAO<Long, Student> {
public void insert(Student t) {}
public void update(Long k, Student t) {}
public void delete(Long k) {}
public void delete() {}
public Student select(Long k) {return null;}
public List<Student> select() {return null;}
}
public <K,T> DAO<K,T>createDAOFactory(EntityType type) {
switch (type) {
case COURSE : return new CourseDAO();
case STUDENT : return new StudentDAO();
}
return null;
}
पहला जवाब
आपको जेनरिक का उपयोग करने की आवश्यकता नहीं है, क्योंकि कार्यान्वयन वर्ग ने प्रकार निर्दिष्ट किया है।
public DAO createDAOFactory(EntityType type) {
switch (type) {
case COURSE : return new CourseDAO();
case STUDENT : return new StudentDAO();
}
return null;
}
संबंधित सवाल
नए सवाल
java
जावा एक उच्च स्तरीय प्रोग्रामिंग भाषा है। इस टैग का उपयोग तब करें जब आपको भाषा का उपयोग करने या समझने में समस्या हो। इस टैग का उपयोग शायद ही कभी किया जाता है और इसका उपयोग अक्सर [वसंत], [वसंत-बूट], [जकार्ता-ई], [Android], [javafx], [हडूप], [श्रेणी] और [मावेन] के साथ किया जाता है।