2010-02-14 2 views
1

J'ai deux définitions de classe dans mon application web Spring MVC nommée classe et l'objet respectivement:Création d'une classe enveloppe

public Class { 
//instance variables 
int classId; 
int className; 


} 


public Object { 
    //instance variables 
int objectId; 
int objectName; 


} 

J'ai aussi un service qui retourne une liste des classes et objets définis comme suit.

package com.service; 


import java.util.ArrayList; 
import java.util.List; 
import java.util.Iterator; 
import com.domain.Class; 
import com.domain.Object; 
import com.service.SearchManager; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

import org.hibernate.Query; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.Transaction; 
import org.hibernate.cfg.Configuration; 


import java.io.Serializable; 

public class SempediaSearchManager implements com.service.SearchManager { 

    private SessionFactory sessionFactory; 
    private List<Class> classes; 
    private List<Object> objects; 



    public List<Class> getClassSeedSearch(String classSeed) { 
     Configuration configuration = new Configuration().configure(); 
     sessionFactory = configuration.buildSessionFactory(); 
     Session session = sessionFactory.openSession(); 
     try { 
     Query query = session.createQuery("from Class c where lower(c.className) like lower('" 
       + classSeed + "%')"); 
     return query.list(); 
     } finally { 
     session.close(); 
     } 

    } 
    public List<Object> getObjectSeedSearch(String objectSeed) { 
     Configuration configuration = new Configuration().configure(); 
     sessionFactory = configuration.buildSessionFactory(); 
     Session session = sessionFactory.openSession(); 
     try { 
     Query query = session.createQuery("from Object o where lower(o.objectName) like lower('" 
       + objectSeed + "%')"); 
     return query.list(); 
     } finally { 
     session.close(); 
     } 
    } 


    ????? 
    skeleton method 
    public List<ClassesAndObjects> getObjectorClassSeedSearch(String objectOrClassSeed) { 
     ????? 
    } 

La vue que je présente a une boîte de recherche qui permettent à un utilisateur de rechercher soit des classes ou objets en fonction de la liste RESPECTIFS renvoyée par les méthodes getObjectSeedSearch et getClassSeedSearch - Liste, Liste respectivement

Ce que je souhaitez permettre à la zone de texte de recherche pour rechercher simplement pour les classes et les objets, retourner peut-être une liste fusionnée - liste - si vous voulez que a deux classes et les objets en tirant parti d'une méthode getObjectorClassSeedSearch

Quelle serait la meilleur moyen d'avancer mettre en œuvre ceci. Je sais vaguement que je voudrais créer une classe wrapper qui prendrait à la fois la classe et l'objet et peut-être polymorphiquement au moment de l'exécution de déterminer quelle instance et élément est lorsqu'il est renvoyé de propped de la liste. Je suppose que j'aurais un bean correspondant pour cela dans ma demande. peut-être un exercice avec des génériques.

Qu'est-ce qui serait un moyen efficace de procéder?

Merci

Répondre

2

ont une interface commune/classe abstraite pour les deux:

public abstract class Name 
{ 
    private int id; 
    private String name; 
    // all attendant ctors and getter/setter stuff here. 
} 

Vous pouvez retourner une liste <Nom> au besoin de cette façon.

Les bons noms sont importants. La surcharge de "Class" et "Object", quand ils font déjà partie du paquetage java.lang, ne fera que causer de la peine à vous et aux futurs responsables de votre code.

Il peut s'agir d'exemples, mais je ne vois aucune raison pour l'une ou l'autre de ces classes. Il n'y a pas d'abstraction ou de comportement riche. Je dirais que c'est un concept qui mérite d'être repensé, basé sur ce que je vois ici.

+0

Merci. Mais en supposant que je n'ai pas utilisé les définitions de classe et d'objet, et utilisé deux définitions différentes, éventuellement avec des méthodes et des variables d'instance différentes, sauf pour les variables d'instance; clas1Name, class1ID, class2Name et class2ID, communs aux deux classes, l'approche d'une solution - une liste contenant des objets de l'une ou l'autre classe - est toujours celle que vous suggérez – Terman

+0

Votre conception proposée souffre toujours du même problème, et ma classe abstraite fonctionne toujours.Si vous voulez avoir un seul type dans la liste, et vous devriez le vouloir, alors vous devez avoir une interface commune ou une classe de base abstraite. – duffymo

1

Je recommande de créer une interface et d'avoir une sorte de méthode "get details" implémentée par Class et Object. Déterminer que cette méthode commune peut être difficile, mais le pire des cas, vous pouvez simplement utiliser instanceof et le lancer après l'avoir sorti de la liste (bien que ce serait un symptôme de mauvaise conception).

par exemple:

public interface SearchResult { 

    public String getDetails(); 

} 

puis:

public class Class implements SearchResult { 
    int classId; 
    int className; 

    public String getDetails() { 
     return "id " + classId + ", name " + className; 
    } 
} 

public class Object implements SearchResult { 
    int objectId; 
    int objectName; 

    public String getDetails() { 
     return "id " + objectId + ", name " + objectName; 
    } 
} 

Il est évident que c'est un exemple simpliste, mais vous voyez l'idée.