over reliance on one arrayList

niceyonom02 :
public class InventorySetDAO{
    public LinkedList<CustomInventory> inventories = new LinkedList<>();           
}

I am developing plugin that add/delete data in arraylist. and There's too much reference on the arrayList from other class.

Class InventoryItemModifier:

public class InventoryItemModifier {
InventorySetDAO inventorySetDAO;

public InventoryItemModifier(InventorySetDAO inventorySetDAO){
    this.inventorySetDAO = inventorySetDAO;
}

public void addItem(ItemStack itemStack, ClickAction click, RequiredItems requiredItems) {
    Bukkit.getPluginManager().callEvent(new ItemAddedEvent());

    inventorySetDAO.getLastInventory().addItem(itemStack, click, requiredItems);
}

public void removeItem(ItemStack itemStack){
    Bukkit.getPluginManager().callEvent(new ItemRemovedEvent());

    inventorySetDAO.getLastInventory().removeItem(itemStack);
}

}

Class InventoryPlayerAccessor:

public class InventoryPlayerAccessor {
InventorySetDAO inventorySetDAO;

public boolean openPage(Player player) {
    if (!inventories.isEmpty()) {
        inventories.get(0).openInventory(player);
        return true;
    }
    return false;
}

public boolean openPage(Player player, int index) {
    if (!inventories.isEmpty()) {
        if (index >= 0 && index < inventories.size()) {
            inventories.get(index).openInventory(player);
            return true;
        }
    }
    return false;
}

}

I think there is risk of manipualte arrayList unproperly, so I think arrayList must be in a class and provide methods(add/insert/remove...) but if then there are too much responsibilities in that class.

I tried to seperate them into multiple classes, but it doesn't seem to solve this problem. is there a way to reduce reliance on arrayList, or efficient way to encapsulate arrayList?

Jason :

To reduce each classes reliance on the underlying ArrayList (or just List), you could think about using the composite pattern instead of the DAO pattern. This would hide all/most of the logic to the InventorySet class.

class InventorySet {

    private final List<CustomInventory> inventories = new ArrayList<>();

    public void addItem() { }

    public void removeItem() { }  

}

Then, you can just keep your InventoryPlayerAccessor (maybe rename) but compose it of a InventorySet for easy access.

class InventorySetView {

    void open();

}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=334306&siteId=1