簡體   English   中英

摘要 Class getter 和 setter 用法 [V2]

[英]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 與 DB 匹配

而不是試圖確保數據庫的表定義與您的 java 代碼完全匹配,這很難(psql)或不可能(大多數其他沒有子表功能的數據庫系統),正如他們所說,如果你不能得到石頭上山,也許把山帶到石頭上:忘記你在 java 中的類型層次。 只需擁有一輛 class 車輛和一個枚舉 VehicleType。 這有點討厭,因為它違反了各種慣用的 java 規則; 現在代表公路自行車的 Vehicle 實例有一個很奇怪的getPickupBed()方法。

這讓我們回到事物的簡單真相:

  • 慣用的(正如大多數教程推薦的那樣,如果你這樣做,所有條紋的工具效果最好,它是大多數數據庫中受支持的路徑,並且該工作流程中的任何問題都可以及早發現並快速修復,因為大多數使用此軟件的人都可以工作就像你一樣,這就是“慣用”的意思)數據庫設計很重要。
  • 慣用代碼很重要。
  • 以慣用 DB 設計表示的相同概念通常與慣用代碼設計不匹配。
  • 我們喜歡自動轉換。

這些東西彼此並不完全兼容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM