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