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

标签 java collections

存储 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/

相关文章:

java - 将 Streams 与原始数据类型和相应的包装器一起使用

java - jar 策略文件

java - 如何安全地将 List 转换为 csv 字节数组?

java - 如何将已排序的索引映射回我正在排序的集合的原始索引

java - 在 java 映射中使用非 Ascii 字符串作为键时没有得到任何值

java - 如何在Java列表中找到所有最大值?

java - 使用对象数组进行插入排序?

java - 我在哪里可以获得 BigClip?

java - 数组列表中相同数字的最大计数

java - 是否有与 .Net 中的 Predicate<T> 方法等效的 Java 1.5?