![](/img/trans.png)
[英]Is it good practice to use private fields in data class primary constructor?
[英]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
類是否具有任何實例方法或屬性。
對於小列表,可以使用List
或Map
。
但是對於較大的列表,您可能需要將它們存儲在數據庫中。
而且String
ArrayList
會比使用Category
ArrayList
稍微有效
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.