2012-01-24 19 views
1

現時点では、私はMVCに基づく小さなWebアプリケーションの作業を開始します。 DAOパターンを使用してモデルレイアウト用のメインクラスを実装しようとしました。だから、Java Generics。私の場合、どんなメリットがありますか?

、私は(例えば)2つのエンティティクラスの作成すべての最初:クラスのことを、私は見、次のステップに

package myProject.model.entity; 

    import java.io.Serializable; 

     public class Book implements Serializable { 

      private static final long serialVersionUID = 7177014660621405534L; 

      private long id; 
      private String title; 
      private String description; 

      public Book() {  
      } 
     // getter and setter methods here 

     } 

:著者や書籍:

package myProject.model.entity; 

import java.io.Serializable; 

    public class Author implements Serializable { 

     private static final long serialVersionUID = 7177014660621405534L; 

     private long id; 
     private String firstName; 
     private String lastName; 

     public Author() {  
     } 
    // getter and setter methods here 

    } 

とBookクラスを本と著者はともにgetId()setId()です。 ので、私は私のエンティティクラスのインタフェースPersistentを作成します。

package myProject.model.entity; 

     public interface Persistent { 

       public long getId(); 
       public void setId(long id); 


     } 

だから、最初の私の質問:

それはmodelパッケージの正しい実装ですか?

次の手順では、パッケージdaoのクラスの実装を開始します。

package myProject.model.dao; 

import java.util.List; 

import myProject.model.entity.Persistent; 

public interface Dao { 

    Persistent get(long id); 

    void save(Persistent persistent); 

    void delete(long id); 
} 

次のステップ:ベースDAO interface Dao

を拡張インターフェースAuthorDaoBookDaoを作成しかし、両方のインタフェース:AuthorDaoとBookDao - 現時点で空。 あなたはどう思いますか?それは普通ですが、インターフェースは空ですか?それは私の2番目の質問です。

最後のステップでは、パッケージmodel.dao.hibernateを作成し、AuthorDaoHibernateクラスとBookDaoHibernateクラスにパッケージに追加します。両方のクラスがAuthorDaoとBookDaoインターフェイスを実装します。

そして今、私の主な質問:オブジェクトと

私のインターフェースDao仕事はPersistentを入力し、私はジェネリックを使用してはいけません。そしてすべての大丈夫といい。

何を考えているん - I再作業Daoインターフェースウィットジェネリック場合、私は、持っているものの利点:

package myProject.model.dao; 

import java.util.List; 

import myProject.model.entity.Persistent; 

public interface Dao<Persistent> { 

    T get(long id); 

    List<T> getAll(); 

    void save(T persistent); 

    void delete(long id); 
} 

マイダオクラスは永続エンティティでのみ動作します - いいえ、他のオブジェクトタイプを...

私の場合、Genericsを使用する理由はありますか?

答えて

2

ジェネリックスは、コードの可読性を大幅に向上させ、間違ったキャストに起因するエラーを減らすことができます。

私たちはあなたの説明に似た何かを使用しています(インターフェイスの実装が必要です)。ブックは、永続的な(

UserDAO userDao; //some injection or lookup 

//no explicit cast needed here, thanks to generics 
UserEntity user = userDao.findById(userId); 

//compiler error due to the generic parameter being UserEntity and AnotherEntity doesn't extend that 
AnotherEntity a = userDao.findById(someId); 
+0

BaseEntity - 抽象的であるか、または非必須である必要がありますか? – user471011

+0

@ user471011いいえ、抽象である必要はありません。エンティティとして注釈されておらず、単純な 'BaseEntity'インスタンスを永続化することはできません。 'BaseEntity'と' BaseDAO'抽象化するのは意味がありますが、簡潔にするためには省略しました。 – Thomas

+0

詳細についてこれについて議論できますか? via mailまたはskype経由ですか?あなたにとっては難しいでしょうか? – user471011

0

ここに理由はありません。それがユニークであれば、それは定義上、一般的ではありません! List getAll()はジョブを行います。

ArrayListは時にはPersistent、時にはPresidentを返すためGenericです。

1

あなたがジェネリックを使用したい場合は、次のようダオを定義する必要があります:あなたはそれを拡張する際

public interface Dao<T extends Persistent> { 
    ..................... 
    void save(T persistent); 
    ................... 
} 

は今、あなたはその保存作成する必要がありますだけブックを受け付けます。

public class Book extends Dao<Book> { 
    ..................... 
    void save(Book persistent); 
    ................... 
} 

ここ利益AuthorBookDaoに渡すことができないということです。これはコンパイルをパスしません。

BTW Hibernate、JPA、または他のORMソリューションを使用している場合、エンティティごとにDAOを作成する必要はありません。 1つの一般的なDAOは、すべてのニーズを解決することができます。

+1

実は '無効保存します。そして、このようなものだUserDAOを使用して

@MappedSuperClass class BaseEntity { @Id private int id; } @Entity class UserEnity extends BaseEntity { //user stuff like name } class BaseDAO<T extends BaseEntity> { public T findById(int id) { ... } //other generic CRUD methods } @Stateless class UserDAO extends BaseDAO<UserEntity> { //additional user specific methods } 

ここでは基本的な例は、(私はbrevitiyためのgetterとsetterアウトを残しておきます)です);実装が基本のものと異なる場合でさえ、必要ではありません。 – Thomas

+1

@トーマス、私は100%あなたに同意します。私は、エンティティ毎にDAOが必要ないと書いていました。 1つの一般的な実装で十分です。 – AlexR

関連する問題