Java Tipo Genérico Uso

Kay:

Tengo estas clases:

Mi problema es que para cada clase que estoy teniendo para registrar manualmente el nodo.

/**
 * 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);

}

Donde <T> siempre algunaClase se extiende mensaje.

Y aquí es cómo un codificador de mensajes tiene el aspecto:

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 se puede ver los artículos en el método de registro, tengo que escribir manualmente que por cada codificador hago.

¿Hay un atajo para esto que simplemente puedo poner en clase abstracta MessageEncoder en su lugar?

No pude encontrar nada que funcione aquí

Editar:

Aquí es el registro de los sig. es:

/**
     * 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:

Usted puede hacer un poco mejor con:

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);
}

Ahora subclases harían:

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

    // etc as before
}

Esto reduce ligeramente en la repetición, y que permite al compilador que le impida hacerlo mal, así que es algo así como una victoria.

Supongo que te gusta

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