跟踪列表中对象的最佳方式?

Best way to keep track of an object in a list?

所以我有一个对象 Size 看起来像这样:

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

然后我有一个尺码列表:

private ArrayList<Size> sizes;

现在我想跟踪 select 编辑了该列表中的哪个尺寸。现在我 使用布尔属性 selected 并且不确定这是否是最好或最干净的方法。我提到的原因是当我 select 一个不同的大小 我必须遍历整个列表并将 selected 更改为 false 除非它是我想要的 .我觉得这让事情过于复杂,想知道是否有 better/cleaner 解决方案。

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

保留对所选 Size 的引用,例如在您有 private ArrayList<Size> sizes; 的同一 class 中,并在每次选择另一个 Size 时更新该引用。

为什么不保留对单独 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;
        }
    }
}

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

使用它来存储选择状态违反了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;
        }
    }
}

希望这对您有所帮助。
祝你好运。