3

私が扱っている Java コードには、データ アクセス オブジェクト (DAO) を定義するためのインターフェイスがあります。ほとんどのメソッドは、データ転送オブジェクト (DTO) のパラメーターを取ります。この問題は、DAO の実装で特定の種類の DTO を参照する必要がある場合に発生します。メソッドは次に、DTO から SpecificDTO への完全に不必要なキャストを実行する必要があります。それだけでなく、コンパイラは、DAO の特定の実装に対して、特定の型のパラメーターとしてのみ取る必要がある型チェックを強制することはできません。 DTO: 私の質問は、これを可能な限り最小の方法で修正するにはどうすればよいかということです。

4

2 に答える 2

12

ジェネリックを使用できます:

DAO<SpecificDTO> dao = new SpecificDAO();
dao.save(new SpecificDTO());
etc.

DAO クラスは次のようになります。

interface DAO<T extends DTO> {
    void save(T);
}

class SpecificDAO implements DAO<SpecificDTO> {
    void save(SpecificDTO) {
        // implementation.
    }
    // etc.
}

SpecificDTO は、DTO を拡張または実装します。

于 2008-10-16T20:56:20.817 に答える
0

ジェネリクスへのリファクタリングは、少なからず苦痛を伴います (おそらくそれだけの価値はありますが)。

コードが次のように DTO インターフェイスを使用している場合、これは特に恐ろしいことです。

DTO user = userDAO.getById(45);

((UserDTO)user).setEmail(newEmail)

userDAO.update(user);

私はこれが行われるのを見てきました(はるかに微妙な方法で)。

あなたはこれを行うことができます:

public DeprecatedDAO implements DAO
{
    public void save(DTO dto)
    {
        logger.warn("Use type-specific calls from now on", new Exception());
    }
}

public UserDAO extends DeprecatedDAO
{
    @Deprecated
    public void save(DTO dto)
    {
        super.save(dto);
        save((UserDTO)dto);
    }

    public void save(UserDTO dto)
    {
        // do whatever you do to save the object
    }
}

これは優れたソリューションではありませんが、実装がより簡単になる可能性があります。レガシ コードは引き続き機能するはずですが、警告とスタック トレースが生成され、それらを追跡するのに役立ちます。また、タイプ セーフな実装も得られます。

于 2008-10-17T16:13:13.523 に答える