我更喜歡將其作為記錄,因為樣板較少,但是會有問題嗎?
IntelliJ 建議我像這樣打開一個基本的 Java 類 @Service:
@Service
public class LocationService {
private final PlaceRepository placeRepository;
@Autowired
public LocationService(PlaceRepository placeRepository) {
this.placeRepository = placeRepository;
}
public List<PlaceDto> findPlacesByRegionId(Long regionId){
return placeRepository.findByRegionId(regionId).stream().map(place -> new PlaceDto(place.getId(), place.getName())).toList();
}
}
變成這樣的 Java 記錄 @Service:
@Service
public record LocationService(PlaceRepository placeRepository) {
public List<PlaceDto> findPlacesByRegionId(Long regionId) {
return placeRepository.findByRegionId(regionId).stream().map(place -> new PlaceDto(place.getId(), place.getName())).toList();
}
}
uj5u.com熱心網友回復:
你可以這樣做,但記錄有吸氣劑(沒有get前綴)。哪個服務層不應該有。您的 Service Facade 公開了公共方法,這些方法通常也是@Transactional,您不想將它們與沒有人會使用的方法混合在一起。
此外,記錄定義了服務類也不需要的equals()& hashCode()。
最后,記錄和服務之間唯一的共同主題是所有欄位通常都是final并且所有這些欄位通常都通過建構式傳遞。這沒有多少共同點。因此,為此使用記錄聽起來是個壞主意。
uj5u.com熱心網友回復:
讓我參考甲骨文的家伙:
JEP 395 說:
[記錄] 是充當不可變資料的透明載體的類。
因此,通過創建記錄,您是在告訴編譯器、您的同事以及整個世界,這種型別是關于資料的。更準確地說,是(表面上)不可變且透明可訪問的資料。這是核心語意 - 其他一切都從這里開始。
如果此語意不適用于您要創建的型別,則不應創建記錄。如果您無論如何都這樣做(可能是被無樣板的承諾所吸引,或者因為您認為記錄等同于 @Data/@Value 或資料類),那么您正在混淆您的設計,并且很有可能它會再次咬人你。所以不要。
更新。
我花了幾分鐘來弄清楚您宣告“IntelliJ 建議我像這樣轉換一個基本的 Java 類 @Service”的根本原因是什么。并找到了以下討論:https : //youtrack.jetbrains.com/issue/IDEA-252036
從而:
- 為 spring bean 使用記錄絕對是一個壞主意:這樣的 bean 不符合自動代理的條件,而且記錄不是為這樣的場景設計的
- 這很尷尬,但 JetBrains 確實誤導了 CE 用戶
uj5u.com熱心網友回復:
您可能誤解了如何使用記錄
public List<PlaceDto> findPlacesByRegionId(Long regionId){
return placeRepository.findByRegionId(regionId).stream().map(place -> new PlaceDto(place.getId(), place.getName())).toList();
}
您的 Service 回傳一個型別為 的物件PlaceDto。
這可能會轉化為記錄,而不是服務。檢查你的PlaceDto,你可能會發現,如果你在 Record 中轉換它,它會保持不變,并且你的樣板代碼更少。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/386334.html
