Java tipo genérico Use

kay:

Eu tenho essas classes:

Meu problema é que para cada classe que eu estou tendo para registrar manualmente o nó.

/**
 * Contains the encoder for messages from the server.
 * 
 * @since 18/08/2018
 */
public abstract class MessageEncoder<T> {

    /**
     * Register this encoder to a message.
     */
    public abstract void register();

    /**
     * Get the encoded message to send to the client.
     * 
     * @param message The message.
     * @return the {@link GamePacket} ready to be sent.
     */
    public abstract GamePacket encode(T message);

}

Onde <T> é sempre someClass estende mensagem.

E aqui está como um codificador de mensagem se parece com:

public final class ComponentMessageEncoder extends MessageEncoder<ComponentTextMessage> {

    @Override 
    public void register() {
        GameConstants.RELEASE.register(ComponentTextMessage.class, this);

    }

    @Override 
    public GamePacket encode(ComponentTextMessage message) {
        // TODO Auto-generated method stub
        return null;
    }

}

Como você pode ver os itens do método de registo, eu tenho que digitar manualmente que para cada codificador eu faço.

Existe um atalho para isso que eu posso simplesmente colocar em MessageEncoder classe abstrata em vez disso?

Eu não poderia encontrar qualquer coisa que funciona aqui

Editar:

Onde registar sig. é:

/**
     * The encoders.
     */
    private final Map<Class<? extends Message>, MessageEncoder<?>> encoders = new HashMap<>();

    /**
     * Register a encoder to a message.
     * 
     * @param message The message.
     * @param encoder The encoder.
     */
    public void register(Class<? extends Message> message, MessageEncoder<?> encoder) {
        encoders.put(message, encoder);
    }
jacobm:

Você pode fazer um pouco melhor com:

public abstract class MessageEncoder<T extends Message> {
    protected MessageEncoder(Class<? extends T> messageClass) {
      GameConstants.RELEASE.register(messageClass, this);
    }

    /**
     * Get the encoded message to send to the client.
     * 
     * @param message The message.
     * @return the {@link GamePacket} ready to be sent.
     */
    public abstract GamePacket encode(T message);
}

Agora subclasses faria:

public final class ComponentMessageEncoder extends MessageEncoder<ComponentTextMessage> {
    ComponentMessageEncoder() {
      super(ComponentTextMessage.class);
    }

    // etc as before
}

Isso reduz um pouco sobre a repetição, e isso permite que o compilador para impedi-lo de fazer errado, por isso é uma espécie de vitória.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=213822&siteId=1
Recomendado
Clasificación