public interface Dao<T> {
Optional<T> getAllBins(UUID id) throws DaoException;
void save(T t, byte[] key);
}
public class ADao<T> implements Dao<T> {
private Codec<T, Map<String, byte[]>> codec;
Client client;
public ADao(Client client, Codec<T, Map<String, byte[]>> codec) {
this.codec = codec;
this.client = client;
}
@Override
public Optional<T> getAllBins(UUID id) throws DaoException {
return codec.decode(id, client.get(id));
}
@Override
public void save(T t, byte[] key) {
Optional<Map<String, byte[]>> encodedValues = codec.encode(t);
for (Map.Entry<String, byte[]> entry : encodedValues.get().entrySet()) {
client.put(entry.getKey(), entry.getValue());
}
}
}
У меня есть универсальный c интерфейс Dao, реализованный классом generi c. Общий c класс ADao
зависит от универсального c кода интерфейса c.
public interface Codec<T,W> {
public Optional<W> encode(T object);
public Optional<T> decode(UUID key, W object);
}
public class ACodecImpl implements Codec<IdGraph, Map<String, byte[]>> {
@Override
public Optional<Map<String, byte[]>> encode(IdGraph graph) {
return Optional.of(encodeGraph(result));
}
@Override
public Optional<IdGraph> decode(UUID key, Map<String, byte[]> bytes) {
return Optional.of(decodeToGraph(key, bytes));
}
}
В приведенном ниже Main
классе
class Main{
public static void main(String[] args) {
Client client = new Client();
Codec codec = new ACodecImpl();
Dao dao = new ADao<IdGraph>(client, codec); //Gives warning unchecked assignment for codec
}
}
В основном Метод основного класса, я получаю предупреждение. непроверенное назначение. Мне было интересно, есть ли лучший дизайн, с помощью которого я могу избежать непроверенного назначения, или это достойный дизайн для того, чего я пытаюсь достичь (отделяя логи кодирования / декодирования c от Dao).