2013-03-07 3 views
0

je suit la classe qui prend une interface et d'exécuter certaines fonctions:Spécifiez le type d'objet d'une liste de tableau retourné dynamiquement

public class MSSQLHandler { 

    IMSSQLStatement statement; 

    public MSSQLHandler(IMSSQLStatement statement) { 
     this.statement = statement; 
    } 

    public void invoke() throws SQLException { 
     statement.executeStatement(); 
    } 

    public List<?> getDataList() throws SQLException { 
     return statement.getDataList(); 
    } 
} 

L'interface est implémentée par une classe abstraite:

public abstract class MSSQLStatement implements IMSSQLStatement { 

    protected Connection conn = null; 
    protected ResultSet rs = null; 

    protected abstract String createStatement() throws SQLSyntaxErrorException; 

    public MSSQLStatement(Connection conn) {  
     this.conn = conn; 
    } 

    public void executeStatement() throws SQLException {  
     Statement st = conn.createStatement(); 
     String sql = createStatement(); 
     if(sql != null) { 
      rs = st.executeQuery(createStatement()); 
     } else { 
      throw new SQLException("Method 'createStatement()' has to be implemented."); 
     } 
    }  
} 

La classe (ou l'interface) qui est passée à la classe gestionnaire étendent la classe abstraite ci-dessus:

public class MSSQLTaskStatement extends MSSQLStatement { 

    public MSSQLTaskStatement(Connection conn) { 
    super(conn); 
    } 

    private String projectName = null; 

    public void setProjectName(String projectName) { 
    this.projectName = projectName; 
    } 

    protected String createStatement() throws SQLSyntaxErrorException { 
     // Create SQL query 
    } 

    @Override 
    public List<MyObjectData> getDataList() throws SQLException { 
     // Wrap results into a data object and save it to an array list 
     List<MyObjectData> l = new ArrayList<MyObjectData>() 
     while(rs.next()) { 
     MyObjectData o = new MyObjectData(); 
     o.setColumn1(rs.getString(1)) 
     l.add(o); 
     } 
     return l; 
    } 
} 

La question est de savoir s'il est possible de passer le type d'objet (MyObjectData) de la méthode retournée de la méthode getDataList() remplacée de la classe MSSQLTaskStatement à la méthode de gestion de classe public List<?> getDataList() throws SQLException?

Cordialement, Sandro

+0

Quelles classes/interfaces de ceux-ci pouvez-vous changer? Tous? –

+0

Oui. Peut-être que j'utilise un mauvais design mais en général ça marche bien jusqu'à présent. Je veux seulement me débarrasser de la distribution nécessaire lors de l'appel de la méthode getDataList() de la classe du gestionnaire. – sk2212

Répondre

1

Ajouter un paramètre de type <T> ou <T extends ObjectDataBaseClass>-IMSSQLStatement et MSSQLStatement, changer la méthode getDataList dans IMSSQLStatement à List<T> getDataList() et utiliser public class MSSQLTaskStatement extends MSSQLStatement<MyObjectData>.

Ensuite, si votre MSSQLHandler a un champ IMSSQLStatement<MyObjectData> statement, son propre getDataList() peut entrer en toute sécurité, retourner un List<MyObjectData> (ou vous pouvez faire MSSQLHandler trop générique, si vous voulez l'utiliser avec des déclarations qui ne construisent pas sur MyObjectData).

+0

Merci! Il suffit de rendre ma classe MSSQLHandler générique avec MSSQLHandler et cela fonctionne très bien. – sk2212

0

Veuillez vous référer à la classe JdbcTemplate de Spring. Il y a des fonctionnalités requises que vous pouvez utiliser même sans utiliser Spring du tout. Ou vous pouvez simplement l'utiliser comme un guide utile pour construire votre propre implémentation de couche persistante.

Questions connexes