In the project under development, there are two RecyclerViews for displaying list items in two different screens. The elements of the list are identical for both lists; therefore, I decided to use a common singleton:
Whole class:
public class ItemComponentLab { private static ItemComponentLab sItemComponentLab; private Map<UUID, ItemSkinComponent> mItemSkins; private ArrayList<ItemModeComponent> mItemMode; public static ItemComponentLab get(Context context){ if (sItemComponentLab == null){ sItemComponentLab = new ItemComponentLab(context); } return sItemComponentLab; } private ItemComponentLab(Context context){ mItemSkins = new LinkedHashMap<>(); ArrayList<ItemSkinComponent> itemSkins = new ArrayList<>(); itemSkins.add(new ItemSkinComponent("skin-1", R.drawable.container1, 0)); itemSkins.add(new ItemSkinComponent("skin-2", R.drawable.container1, 0)); itemSkins.add(new ItemSkinComponent("skin-3", R.drawable.container2, 0)); itemSkins.add(new ItemSkinComponent("skin-4", R.drawable.container2, 0)); itemSkins.add(new ItemSkinComponent("skin-5", R.drawable.container3, 0)); itemSkins.add(new ItemSkinComponent("skin-6", R.drawable.container3, 0)); for (ItemSkinComponent i : itemSkins){ mItemSkins.put(i.getID(), i); } mItemMode = new ArrayList<>(); mItemMode.add(new ItemModeComponent("MODE-1", R.drawable.container1, 0)); mItemMode.add(new ItemModeComponent("MODE-2", R.drawable.container2, 0)); mItemMode.add(new ItemModeComponent("MODE-3", R.drawable.container3, 0)); } public ArrayList<ItemSkinComponent> getItemSkins(){ return new ArrayList<>(mItemSkins.values()); } public ItemSkinComponent getSkinComponent(UUID id){ return mItemSkins.get(id); } public ArrayList<ItemModeComponent> getItemMode(){ return mItemMode; } public ItemModeComponent getModeComponent(UUID id){ for (ItemModeComponent imc : mItemMode){ if (imc.getID().equals(id)){return imc;} } return null; } } As you can see in the code above for two, the array is a different implementation. For clarity, break them into two parts:
ItemSkinComponent
private ItemComponentLab(Context context){ mItemSkins = new LinkedHashMap<>(); ArrayList<ItemSkinComponent> itemSkins = new ArrayList<>(); itemSkins.add(new ItemSkinComponent("skin-1", R.drawable.container1, 0)); itemSkins.add(new ItemSkinComponent("skin-2", R.drawable.container1, 0)); itemSkins.add(new ItemSkinComponent("skin-3", R.drawable.container2, 0)); itemSkins.add(new ItemSkinComponent("skin-4", R.drawable.container2, 0)); itemSkins.add(new ItemSkinComponent("skin-5", R.drawable.container3, 0)); itemSkins.add(new ItemSkinComponent("skin-6", R.drawable.container3, 0)); for (ItemSkinComponent i : itemSkins){ mItemSkins.put(i.getID(), i); } } public ArrayList<ItemSkinComponent> getItemSkins(){ return new ArrayList<>(mItemSkins.values()); } public ItemSkinComponent getSkinComponent(UUID id){ return mItemSkins.get(id); } and ItemModeComponent
private ItemComponentLab(Context context){ mItemMode = new ArrayList<>(); mItemMode.add(new ItemModeComponent("MODE-1", R.drawable.container1, 0)); mItemMode.add(new ItemModeComponent("MODE-2", R.drawable.container2, 0)); mItemMode.add(new ItemModeComponent("MODE-3", R.drawable.container3, 0)); } public ArrayList<ItemModeComponent> getItemMode(){ return mItemMode; } public ItemModeComponent getModeComponent(UUID id){ for (ItemModeComponent imc : mItemMode){ if (imc.getID().equals(id)){return imc;} } return null; } Now actually the question: which implementation is better to use? In the first one it confuses: initialization of an array of objects ItemSkinComponent -> we push it into LinkedHashMap <> () -> return an array of objects by the method getItemSkins () . In the last confuses: method getModeComponent (UUID id) or rather the comparison cycle Id. Thank.