[英]Abstract Class getter and setter usage [V2]
早上好,
這是我最近詢問的關於正確使用抽象類的問題的附加內容。
我目前有一個抽象的 class 和 2 個子類,例如參見插圖:
public abstract class Vehicle {
String type;
String color;
...getter and setters
}
從父級繼承 getter 和 setter,外加一個獨特的屬性
public class Truck extends Vehicle{
String pickupBed;
public setPickupBed(String pickupBed){
this.pickupBed = pickupBed;
}
public getPickupBed(String pickupBed){
return pickupBed;
}
.....Parent class getter and setters
}
從父級繼承 getter 和 setter
public class Car extends Vehicle{
.....Parent class getter and setters
}
例如,當我在 DAO class 中創建一個方法時,我遇到的情況是
public Vehicle selectAllRecords(){
...DO database stuff
return VehicleRowMapperWithData();
}
如果我調用Vehicle veh = selectAllRecords()
我不能這樣做veh.getPickupBed()
我明白這不是它的工作原理,但我該如何做到這一點? 我嘗試鑄造,但沒有奏效。
提前致謝
沒有簡單的答案。
一些數據庫支持“子類化”; 您可以制作一個擴展另一個表格的表格。 例如,Postgres 可以做到這一點。 許多 DB 抽象層不支持它,psql 也不能很好地支持它(它可以工作並得到維護,但不推薦)。 只要 DB 或多或少完美地反映了您的 java 代碼的工作方式,那么您使用的工具至少有機會像魔術一樣弄清楚該做什么。
暫時忘記 java。 看看你的數據庫表。 你怎么知道某輛車實際上是一輛卡車? 是否有一個單獨的表稱為“卡車”? 是否有“vehicleType”列,每種車輛的所有自定義字段都是數據庫表中的一列,每一行不是那種車輛,每行都持有 NULL 或該列的一些虛擬值? 在這種情況下,您將編寫一個大的 if/elseif 塊來檢查車輛類型列,然后調用正確的new Car(...)
或new Truck(...)
構造函數。
更一般地說,您現在的 java object model 和您的 DB Z20F35E6305F44DBFA4ZC3F6 之間不匹配。
不過,這通常是一件好事,JPA 和朋友在這兩個精確匹配時效果最好,但考慮到 java 是 OO 並且喜歡層次結構,而 DB 真的不這樣做。 這不一定是一個好主意,但是:一旦您的 java 的 class 結構與數據庫存儲事物的方式不匹配(例如,在您的數據庫中,它是一個帶有“類型”列的表,在 java 中,它是類的層次結構和沒有“類型”字段,而是有 Car 的實例、Truck 的實例等)——這意味着自動化工具不能只是神奇地把一個變成另一個。 您編寫執行此操作的代碼。
而不是試圖確保數據庫的表定義與您的 java 代碼完全匹配,這很難(psql)或不可能(大多數其他沒有子表功能的數據庫系統),正如他們所說,如果你不能得到石頭上山,也許把山帶到石頭上:忘記你在 java 中的類型層次。 只需擁有一輛 class 車輛和一個枚舉 VehicleType。 這有點討厭,因為它違反了各種慣用的 java 規則; 現在代表公路自行車的 Vehicle 實例有一個很奇怪的getPickupBed()
方法。
這讓我們回到事物的簡單真相:
這些東西彼此並不完全兼容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.