gpt4 book ai didi

java - 在 `Collection ` 内部和外部 `MyObject` 类之间进行选择 [Java]

转载 作者:行者123 更新时间:2023-11-30 10:23:34 28 4
gpt4 key购买 nike

存储 Collection<MyItem> 的最佳方式是什么? ?该集合对于当前用户来说实际上是静态的。每个用户只能看到他们的 Collection 。 MyItem项目工具 IItem :

public interface IItem {    
public Integer getItemID();
public void setItemID(Integer id);
public String getTitle();
public void setTitle(String title);
/*more getters and setters*/
public IItem parseServerResponse(String response);
public int postItem(); //posts this IItem to server, return ok ->200, unauth->401, etc
public IItem findItem(String[] filters);
/*more advanced methods*/
}

我可以存储 Collection<MyItem>其他地方,但后来我无法访问私有(private) MyItem来自 CurrentMyItems 的方法:

public class CurrentMyItems{        
private final List<IItem> allItemsList;
public CurrentMyItems(String allItemsServerResponseString){
JSONArray rawItems = parseResponse(allItemsServerResponseString);
int arrSize = rawItems.length()+estimateQuantityOfNewItems();
List<IItem> allItemsList = new ArrayList<>(arrSize);
for (int i = 0; i < Items.length(); i++) {
allItems.add(i, parseItem(Items.get(i)));
}
}
/*methods*/
}

或者在MyItem里面类(见注释掉的选项):

public class MyItem implements  IItem {
/*
private final static List<IItem> allItemsStaticList = new ArrayList<>();
private final static Map<Integer, IItem> allItemsStaticMap = new HashMap<>();
private final List<IItem> allItemsList; //
private final static Map<Integer, IItem> allItemsMap;
*/
/*implemented methods*/
}

allItemsStaticList - 存储所有项目的静态列表。似乎内存效率高,但如果我将来需要存储单独的 MyItems 集合怎么办?这不太可能,但仍然......

allItemsList - 同一类有两个不同的功能。要么是

存储单个项目,在这种情况下 allItemsList/Map = null;
或者
allItemsList = new ArrayList<>(); ,而其他字段为空。 这看起来没问题,但它违反了最小惊喜原则。

存储 MyItemCollection 的方法更自然?

此外,我应该存储 Item 吗?作为 MapList鉴于MyItem myItem = getMyItemByID(int id);是访问MyItem的主要途径?


更新

我们可以实现一个 Item类,以便一个实例可以保存 Item 的集合实例或建模数据,但不能两者兼而有之。

public class Item {
private final Map<Integer, Item> itemsMap;
private final IntegerProperty itemID; // private final String[] names;

public Item(){
itemsMap = new HashMap<>();
itemID = null; //names = null;
}

private Item(Integer id) {
itemsMap= null;
itemID = new SimpleIntegerProperty(id); //names = new String[1];
}

public Item makeGenericItem(){
return itemsMap == null ? null : new Item(itemsMap.size());
}
// other methods, including getters and setters
}

但是代价是什么?.. 这个类违反了单一责任原则。

结论 - 在大多数情况下,Item 实例的 Collection 应该存储在 Item 类之外。

最佳答案

在 OOP 中,对象的数据元素也称为对象的属性。因此,您应该问问自己,项目集合是否是项目的属性。

例如,当您假设您的项目是学生时。您会说学生列表是学生的属性吗? -- 可能不是,因为学生列表不是学生的一部分。相反,学生是学生列表的一部分。

由于学生列表不是现实生活中学生的属性,我不会在代码中对其进行不同的建模,只是为了使其在技术上更优雅。

你的类的设计应该由你正在工作的域的结构驱动。当你需要决定把属性放在哪里时,不要问“把它放在这里是否有意义,因为我的特性编程语言报价?”但要问“这个属性在我的域中属于哪里?”。

关于java - 在 `Collection <MyObject>` 内部和外部 `MyObject` 类之间进行选择 [Java],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46940642/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com