[英]Java Generic / Enum in Factory
我正在研究 Java,想了解如何實現這種產品工廠的想法? (或其他方式的代碼結構)
public interface VirtualBD <E extends Enum<E>> {
void addInStorage(Class<E> type, Product product, int amount);
}
1 問:如何使用泛型獲取任何類型的枚舉 class 作為參數
根類別
public abstract class Product {
...
}
public enum AlchogolType {
Beer, Vodka;
}
public enum nonAlchogolType {
FreshJuise, Lemonade;
}
子類別
public abstract class Alchogol extends Product {
...
}
public abstract class nonAlchogol extends Product {
...
}
public class Beer extends Alchogol {
...
}
而且,這里有一個問題開始:
public class AlchogolTables implements VirtualBD{
HashMap<Alchogol, Integer> beer = new HashMap<Alchogol, Integer>();
HashMap<Alchogol, Integer> vodka = new HashMap<Alchogol, Integer>();
@Override
public void addInStorage(AlchogolType type, Product product, int amount) {
switch (type) {
case Beer:
beer.put((Alchogol) product,amount);
break;
case Vodka:
vodka.put((Alchogol) product,amount);
break;
default:
break;
}
}
}
在我的想法中-我想對不同的產品使用addInStorage方法,例如:
public class OtherBeveragesTables implements VirtualBD{
HashMap<nonAlchogol, Integer> orangeFresh = new HashMap<nonAlchogol, Integer>();
HashMap<nonAlchogol, Integer> soda = new HashMap<nonAlchogol, Integer>();
@Override
public void addInStorage(nonAlchogolType type, Product product, int amount) {
switch (type) {
case FreshJuise:
orangeFresh.put((nonAlchogol) product,amount);
break;
case Lemonade:
soda.put((nonAlchogol) product,amount);
break;
default:
break;
}
}
}
“我如何使用 Enum AlchogolType/nonAlchogolType 作為參數?”
在閱讀您的問題時,我假設您正在尋找一種方法來在同一方法中將 AlchogolType 和 NonAlchogolType 作為參數傳遞。 不幸的是,這是不可能的,因為方法要求特定類型。 與類不同,枚舉不能覆蓋其他類/枚舉。 這意味着方法中給出的參數類型不能是其他任何東西。
假設有EnumOne
(APPLE, BANANA, PINEAPPLE) 和EnumTwo
(AUDI, BWM, FORD)。 如果一個方法請求EnumOne
類型的參數,則無法傳遞EnumOne
枚舉中未定義的任何其他內容。 嘗試從EnumTwo
傳遞值時,您會遇到編譯器錯誤。
如果您想解決此問題,可以嘗試將這些值放在一個枚舉 class 中。 僅當您的代碼仍然可以保持可維護性和高效性時才這樣做。
“我懷疑這樣一個任務的代碼組織的正確性:為許多具有類別、一些差異和相似之處的產品編寫工廠。”
即使您在代碼中使用抽象將邏輯與模型分開,您仍然使用單獨的類(在您的情況下為 VirtualDB 類),這會阻止您的程序在面向對象編程中使用抽象的好處。
在您的 model 類(在您的情況下為啤酒)中使用抽象是好的。 我建議保持這種狀態,而不是 go 進一步結合您的工廠類應用抽象。
我相信您只需要 1 個工廠 class 即可容納您的所有產品。 您可以為每種類型的飲料制作 HashMap,但這使得您在制作新型飲料時始終必須更新您的工廠 class。 您可以做的是制作一個 HashMap 作為關鍵Product
和作為值Integer
,然后將您的飲料類型的枚舉保存在Product
class 中。 原因是飲料的類型是產品的屬性。 現在判斷飲料類型的唯一方法是知道它保存在什么 HashMap 中。考慮到稍后在您的代碼中您可能可以訪問 Product 實例,而無法訪問工廠中的 HashMap,這似乎效率低下。 在 Product 實例本身中保存飲料類型時,您可以創建一個返回飲料類型的方法,僅此而已。
“是 CAST: beer.put((Alchogol) product,amount); 正常方式嗎?”
這是否可以,實際上取決於您事先做了什么。 這一切都與“狗是動物,但動物並不總是狗”的故事有關。
假設您有一個抽象的 class Animal
和兩個類Dog
和Cat
,它們都繼承自Animal
class。 如果您有一個Animal
的實例繼承了 class 並且您想要強制轉換為Dog
並且您之前沒有檢查此實例是否實際上是一只狗,那么您要求拋出錯誤。 該實例可以是Dog
class 的實例,但也可以是Cat
class 的實例。 如果您嘗試將其轉換為錯誤的繼承類型,您將得到java.lang.ClassCastException 。
要解決可能引發此錯誤的可能情況,請務必事先檢查您嘗試轉換的變量是否屬於特定的繼承類型。 你應該看看instanceof關鍵字。
僅供參考,如果您沒有事先檢查變量,現代 IDE 在大多數情況下會在您嘗試強制轉換變量時向您發出警告。
我的主要語言不是英語。 我盡力解釋它。 如果您確實有任何意見或任何想讓我知道的內容,請隨時編輯我的評論或在其下方發表評論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.