跟踪列表中对象的最佳方式?
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;
}
}
}
希望这对您有所帮助。
祝你好运。
所以我有一个对象 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;
}
}
}
希望这对您有所帮助。
祝你好运。