キャッシュレイヤーに次のパターンを実装しようとしています。
getUsers()
in serCache Class、getLikes()
in PostsCache classなどの可能なキャッシュメソッドの実装を分割しています。
しかし、私はこれらすべてのメソッドにCache.getUsers()
、Cache.getLikes()
などの単一クラスオブジェクトからアクセスできるようにしたい
この背後にある理由は、このレイヤーを使用している開発者が、このレイヤーの背後で行われた分割を認識しないようにしたいからです。
私は次のことをしました
2インターフェース-UserCache, PostsCache
およびインターフェースを実装する2つのクラス-UserCacheImpl, PostsCacheImpl
。
これら2つのインターフェイスを実装する抽象クラス AbstractCacheを導入しようとしたところ、このCacheクラスがその抽象クラスを拡張します。しかし、それは失敗しました:(
これらの2つを1つのCache
オブジェクトからアクセスできるようにするにはどうすればよいでしょうか。案内してください
あなたが持っていることは完全に可能です
これら2つのインターフェースを実装するa [n]抽象クラスAbstractCacheは、このCacheクラスがその抽象クラスを拡張します。
public interface UserCache {
int getUsers();
}
public interface PostsCache {
int getLikes();
}
public abstract class AbstractCache implements UserCache, PostsCache {
@Override public int getUsers() { return 12; }
@Override public int getLikes() { return 34; }
}
public class Cache extends AbstractCache {
}
そして、すべてが完璧にコンパイルされます。もちろん、Javaで実行できないことは、1つのクラスが2つのクラスを拡張する多重継承を持つことです) (2つのインターフェースを実装するのとは対照的に)、そうすることはできません
public abstract class AbstractCache extends UserCacheImpl, PostsCacheImpl {
}
これがあなたが実際にやろうとしていることだと思います。ここでの解決策は継承よりも構成を優先すること:
public abstract class AbstractCache implements UserCache, PostsCache {
private UserCacheImpl userCache;
private PostsCacheImpl postsCache;
public AbstractCache() {
userCache = new UserCacheImpl();
postsCache = new PostsCacheImpl();
}
@Override public int getUsers() { return userCache.getUsers(); }
@Override public int getLikes() { return postsCache.getLikes(); }
}