जावा विधियों के सामान्य प्रकारों को वापस करने के संबंध में बहुत सारे प्रश्न हैं, लेकिन उनमें से किसी ने भी अब तक मेरी मदद नहीं की है।

तो यहाँ मेरा कोड है:

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

क्या कोई इस विधि को लिखने और लागू करने में मेरी मदद कर सकता है ???

चीयर्स,
रोमुअल्डो।

0
Romualdo Rubens de Freitas 15 अगस्त 2017, 04:01

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() को कॉल करेंगे।

1
shmosel 15 अगस्त 2017, 04:26

शायद आप ऐसा कर सकते हैं?

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;
}
0
flytosea 15 अगस्त 2017, 04:36