簡體   English   中英

這是一個好習慣嗎? (類字段)

[英]Is this a good practice? (Class fields)

我需要定義相對大量的類別(開始時大約30個類別,我們將添加更多類別)。 考慮以下代碼:

public class Category {

    public static final Category DRESS = new Category("Dress");
    public static final Category SKIRT = new Category("Skirt");
    ...

    private static final List<Category> CATEGORIES = Arrays.aslist(DRESS, SKIRT, ...);

    private String name;

    public Category(String name) {
         this.name = name;
    }

    //Some static public method to iterate over categories
   ... 

我需要聲明類別,還需要一種對它們進行迭代的方法。 我放棄反射,因為我認為這不是一個很好的做法。

聲明同一類的靜態final字段的大名稱並將它們包含在列表中是否是一種好習慣? 作為替代方案,我考慮過使用Map<Integer, Category>代替列表,並且字段是可以標識每個類別的整數,因此您可以通過將其放入地圖中來獲得類別。 就時間和空間性能而言,這會更好嗎?

PS:適用於android項目,如果有更改

考慮以下代碼:

public class Category {

    public static final Category DRESS = new Category("Dress");
    public static final Category SKIRT = new Category("Skirt");

是的,這實際上是枚舉在后台執行的操作,因此

public enum Category {
    DRESS("Dress"),
    SKIRT("Skirt"),
    ...;

    private String name;

    private Category(String name) {
         this.name = name;
    }

    // Category.values() returns the elements as an array

您應該使用enum而不是使用new Category("Dress");創建對象new Category("Dress"); 因為創建對象比使用enum 昂貴 Java枚舉的實現更像類,因此您可以無縫更改代碼:

public enum Category {
  DRESS("Dress"), SKIRT("Skirt");

  private final String name;

  Category(String name) { 
    this.name = name; 
  }

  public String getName() { 
    return name; 
  }
}

注意:
枚舉類型的構造函數必須是程序包私有或私有訪問。 它會自動創建在枚舉主體開頭定義的常量。 您不能自己調用​​枚舉構造函數。

Enum Types上了解有關枚舉的更多信息

我會說使用List就足夠了。

僅當您必須通過某些關鍵屬性(例如int案例)非常頻繁地查找特定Category才應考慮使用Map

如果Category類中沒有屬性或方法,請考慮將其替換為Strings

如果在運行時創建了新Categories ,並且要保留它們,請考慮使用數據庫或文件來保存類別。

編輯:回答評論中的問題

那將取決於Category類。 如果其唯一目的是枚舉所有類別,並且該類本身沒有任何其他實例方法或屬性,則就空間復雜度而言, Integer和您的Category類是相似的(因為Map整數將被裝在Integer類中賓語)

我仍然建議您使用一個名為Category和list的Category ,如果其目的僅是在它們上進行迭代和/或使用應用程序中其他位置的Category類的特定實例。 Category.SOME_CATEGORY

以下示例是一個很好的用例

someMethod(Category category) {
    // do something
}

someMethod(int category) {
   // before doing anything
   // lookup this category by an int key
   // in the the Map<Integer, Category>
}

后者的問題是,您可以傳遞可能不是類別的有效鍵的任何int值。 使用類可以提供一些額外的編譯時間檢查。 雖然您也可以始終使用int def 但是我再次重申,這全都歸結為Category類是否具有任何實例方法或屬性。

對於小列表,可以使用ListMap

但是對於較大的列表,您可能需要將它們存儲在數據庫中。

而且String ArrayList會比使用Category ArrayList稍微有效

暫無
暫無

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

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