跟踪列表中对象的最佳方法是什么?

时间:2015-01-13 22:48:16

标签: java android oop

所以我有一个大小的对象,如下所示:

public class Size {
    private String name;
    private double price;
    private boolean selected;
}

然后我有一个尺寸列表:

private ArrayList<Size> sizes;

现在我想跟踪选择该列表中的哪个大小。现在我使用选择的布尔属性,并且不确定这是最好还是最干净的方式。我提到的原因是当我选择不同的大小我必须通过整个列表进行迭代并将选择更改为false,除非它是我想要的。我觉得这样做过于复杂,并且想知道是否有更好/更清洁的解决方案。

4 个答案:

答案 0 :(得分:2)

Size类应该是名称和价格的容器(大概)。

使用它存储选择状态违反了Single Responsibility Principle


您可以使用以下内容。

<强> Selectable.java

public class Selectable<E> {

    /**
     * Selects the specified element if it is possible.
     *
     * @param element the element tot be selected.
     * @return true if selection is successful, false otherwise.
     */
    public boolean select(E element);

    /**
     * Returns selected element if any.
     * 
     * @return The selected element if any element is selected.
     * @throws NoSuchElementException if no element is selected.
     */
    public E getSelected() throws NoSuchElementException;
}

<强> SelectableArrayList.java

public class SelectableArrayList<E> extends ArrayList<E> implements Selectable<E> {

    private E selected;    // Can also be implemented using an index.

    public SelectableArrayList() {
        super();
        this.selected = null;
    }

    @Override
    public boolean select(E element) {
        if (super.contains(element)) {
            this.selected = element;
            return true;
        } else {
            return false;
        }
    }

    @Override
    public E getSelected() throws NoSuchElementException {
        if (this.selected == null) {
            throw new NoSuchElementException("No element is selected in the list.");
        } else {
            return this.selected;
        }
    }
}

希望这有帮助。
祝你好运。

答案 1 :(得分:1)

您可以保留选择项目的索引。

答案 2 :(得分:1)

为什么不保留对单独的Size变量的引用? 像这样:

public class Size {
    private String name;
    private double price;
    private boolean selected;
}

public class example {
    private Size selectedSize;
    private ArrayList<Size> sizes;

    public example() {
        Size s1 = new Size();
        Size s2 = new Size();
        Size s3 = new Size();

        sizes.add(s1);
        sizes.add(s2);
        sizes.add(s3);

        if (someCondition == true){
            // Select s1
            selectedSize = s1;
        }
    }
}

答案 3 :(得分:0)

保持对所选Size的引用,例如在您拥有private ArrayList<Size> sizes;的同一班级中,并在每次选择其他Size时更新该引用。