Lista de aceptación genérica como parámetro y usarlo de base en su tipo

user3819295:

Estoy desarrollando un sitio web para mi empresa, y utilizar la primavera como mi backend. Hay una situación ahora, cuando necesito usar uno de mi método Utilidades de dos veces, pero por diferentes DAOs.

Con el fin de evitar la duplicación de código, me preguntaba ¿cómo puedo usar Java genéricos con el fin de hacer que este método utilizable para ambos casos. El método que acabamos de contar uno de los campos que es común para ambos DAO.

método Util:

SeverityCount calculateSeveritiesCount(List<?> events){

        if(null == events){
            return new SeverityCount();
        }

        if(events.get(1) instanceof EventDAO){
            events = (List<EventDAO>)events;
        }
        else if (events.get(1) instanceof EventsByAreaDAO) {
            events = (List<EventsByAreaDAO>)events;
        }

        Map<String, Long> severityCountMap = events.stream().collect(
            Collectors.groupingBy(
                EventDAO::getSeverity,  //It should be EventDAO or EventsByAreaDAO. both has severity field.
                Collectors.counting())
        );

        return mapper.convertValue(severityCountMap, SeverityCount.class);
    }

DAO Evento:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "events")
public class EventDAO {
    @Id @Column(name = "uid")
    private String uID;

    private String date;

    private String severity;

}

Área DAO:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "events")
public class EventsByRegionDAO {

     @Id @Column(name = "uid")
    private String uID;

    private String date;

    private String type;

    private String severity;

    private String area;

    private String server;
}

Así es como yo lo llamo desde el servicio:

SeverityCount severitiesCount = Utils.calculateSeveritiesCount(eventsList);  //EventsList could be list of EventDAO or EventsByAreaDAO
Marko Pacak:

Puede cambiar el método de

SeverityCount calculateSeveritiesCount(List<? extends SeverityCalculable> events)

dónde SeverityCalculable

interface SeverityCalculable {
    String getSeverity(); // implemente getter in all subclasses
}

Tienen todas sus clases correspondientes implementen esta interfaz.

public class EventDAO implements SeverityCalculable  {

    // ...

    @Override
    public String getSeverity() {
        return this.severity;
    }
}

En su método, quitar los moldes y debe convertirse en algo como esto:

 SeverityCount calculateSeveritiesCount(List<? extends SeverityCalculable> events) {

    if(null == events){
        return new SeverityCount();
    }

    Map<String, Long> severityCountMap = events.stream().collect(
        Collectors.groupingBy(
            SeverityCalculable::getSeverity,
            Collectors.counting()
        )
    );

    return mapper.convertValue(severityCountMap, SeverityCount.class);
}

Supongo que te gusta

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