パラメータとして一般的なリストを受け入れ、その種類にもベースを使用

user3819295:

私は私の会社のためのウェブサイトを開発している、と私は私のバックエンドとして春を使用しています。私は、異なるのDAOのために、二回私のUtilsの方法のいずれかを使用する必要があり、今の状況は、あります。

コードの重複を避けるために、私はどのように私は両方のケースのために、このメソッドを使用可能にするためにJavaのジェネリックを使用することができると思いまして。この方法は、単に両方のDAOのために共通である分野の一つ数えます。

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:

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

    private String date;

    private String severity;

}

エリア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;
}

これは私がサービスからそれを呼び出す方法です:

SeverityCount severitiesCount = Utils.calculateSeveritiesCount(eventsList);  //EventsList could be list of EventDAO or EventsByAreaDAO
マルコのpacak:

あなたはに方法を変更することができます

SeverityCount calculateSeveritiesCount(List<? extends SeverityCalculable> events)

どこ SeverityCalculable

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

すべての関連するクラスは、このインタフェースを実装しています。

public class EventDAO implements SeverityCalculable  {

    // ...

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

今すぐあなたの方法では、キャストを削除し、それがこのようなものになるはずです。

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=178149&siteId=1