簡體   English   中英

Java 通用/工廠枚舉

[英]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;
        }
        
    }

}
  1. 我如何使用 Enum AlchogolType/nonAlchogolType 作為參數?
  2. 我懷疑這樣一個任務的代碼組織的正確性:為許多具有類別、一些差異和相似之處的產品編寫工廠。
  3. 是一個 CAST: beer.put((Alchogol) product,amount); 正常方式?

問題 1

“我如何使用 Enum AlchogolType/nonAlchogolType 作為參數?”

在閱讀您的問題時,我假設您正在尋找一種方法來在同一方法中將 AlchogolType 和 NonAlchogolType 作為參數傳遞。 不幸的是,這是不可能的,因為方法要求特定類型。 與類不同,枚舉不能覆蓋其他類/枚舉。 這意味着方法中給出的參數類型不能是其他任何東西。

假設有EnumOne (APPLE, BANANA, PINEAPPLE) 和EnumTwo (AUDI, BWM, FORD)。 如果一個方法請求EnumOne類型的參數,則無法傳遞EnumOne枚舉中未定義的任何其他內容。 嘗試從EnumTwo傳遞值時,您會遇到編譯器錯誤。

如果您想解決此問題,可以嘗試將這些值放在一個枚舉 class 中。 僅當您的代碼仍然可以保持可維護性和高效性時才這樣做。

問題2

“我懷疑這樣一個任務的代碼組織的正確性:為許多具有類別、一些差異和相似之處的產品編寫工廠。”

即使您在代碼中使用抽象將邏輯與模型分開,您仍然使用單獨的類(在您的情況下為 VirtualDB 類),這會阻止您的程序在面向對象編程中使用抽象的好處。

在您的 model 類(在您的情況下為啤酒)中使用抽象是好的。 我建議保持這種狀態,而不是 go 進一步結合您的工廠類應用抽象。

我相信您只需要 1 個工廠 class 即可容納您的所有產品。 您可以為每種類型的飲料制作 HashMap,但這使得您在制作新型飲料時始終必須更新您的工廠 class。 您可以做的是制作一個 HashMap 作為關鍵Product和作為值Integer ,然后將您的飲料類型的枚舉保存在Product class 中。 原因是飲料的類型是產品的屬性。 現在判斷飲料類型的唯一方法是知道它保存在什么 HashMap 中。考慮到稍后在您的代碼中您可能可以訪問 Product 實例,而無法訪問工廠中的 HashMap,這似乎效率低下。 在 Product 實例本身中保存飲料類型時,您可以創建一個返回飲料類型的方法,僅此而已。

問題 3

“是 CAST: beer.put((Alchogol) product,amount); 正常方式嗎?”

這是否可以,實際上取決於您事先做了什么。 這一切都與“狗是動物,但動物並不總是狗”的故事有關。

假設您有一個抽象的 class Animal和兩個類DogCat ,它們都繼承自Animal class。 如果您有一個Animal的實例繼承了 class 並且您想要強制轉換為Dog並且您之前沒有檢查此實例是否實際上是一只狗,那么您要求拋出錯誤。 該實例可以Dog class 的實例,但也可以是Cat class 的實例。 如果您嘗試將其轉換為錯誤的繼承類型,您將得到java.lang.ClassCastException

要解決可能引發此錯誤的可能情況,請務必事先檢查您嘗試轉換的變量是否屬於特定的繼承類型。 你應該看看instanceof關鍵字。

僅供參考,如果您沒有事先檢查變量,現代 IDE 在大多數情況下會在您嘗試強制轉換變量時向您發出警告。


我的主要語言不是英語。 我盡力解釋它。 如果您確實有任何意見或任何想讓我知道的內容,請隨時編輯我的評論或在其下方發表評論。

暫無
暫無

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

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