我有一个枚举的ArrayList,但是我需要确保只有一个特定的枚举(或者它被调用的任何东西)。我应该创建一个扩展ArrayList的新类并检查输入吗?我已经看到,也许最好不要(Can you extend ArrayList in Java?),但我看不到更好的方法。
我的枚举
enum myEnum{
SPECIAL,
OTHER1,
OTHER2,//etc
}
with ArrayList
List<myEnum> list = new ArrayList<>();
list.add(myEnum.SPECIAL);
list.add(myEnum.OTHER1);
list.add(myEnum.SPECIAL);//OH NO!!!
没有ArrayList
class myList extends ArrayList<myEnum> {
@Override
public boolean addAll(int i, Collection<? extends myEnum> clctn) {
if(check()){
super.addAll(i, clctn);
}else{
//do something or throw error;
}
}
@Override
public boolean addAll(Collection<? extends myEnum> clctn) {
if(check()){
super.addAll(clctn);
}else{
//do something or throw error;
}
}
@Override
public void add(int i, myEnum e) {
if(check()){
super.add(i, e);
}else{
//do something or throw error;
}
}
@Override
public boolean add(myEnum e) {
if(check()){
return super.add(e);
}else{
//do something or throw error;
}
}
boolean check(){
//do stuff
}
}
myList list = new myList();
list.add(myEnum.SPECIAL);
list.add(myEnum.OTHER1);
list.add(myEnum.SPECIAL);//something happens or error is thrown
有更好的方法还是可以接受?
答案 0 :(得分:5)
在您的情况下,您不应该扩展ArrayList。
正如@ John3136在评论中指出的那样,from google import storage, bigquery
proj_a_client = storage.Client.from_service_account_json(service_acct_A.json)
proj_b_client = bigquery.Client.from_service_account_json(service_acct_B.json)
dest_table = proj_b_client.dataset('DS_B').table('huge_table')
uri = 'gs://project_A//*'
job_config = bigquery.LoadJobConfig()
load_job = proj_b_client.load_table_from_uri(uri,
dest_table,
job_config=job_config)
是一个为您处理唯一性的集合。 Java提供EnumSet
,这是一个专门用于有效处理枚举的集合。使用枚举时,请使用此而不是Set
等其他实现。
答案 1 :(得分:1)
也许你需要一套。
来自java文档:
public interface Set extends Collection一个集合 不包含重复元素。更正式地说,集合不包含任何一对 元素e1和e2使得e1.equals(e2),并且至多为1 元件。正如其名称所暗示的那样,该界面对其进行建模 数学集抽象。
HashSet是实现类之一。
答案 2 :(得分:1)
如果您需要唯一元素,则需要Set
。
如果你想要一个List,你也希望能够订购这些元素。
看哪LinkedHashSet
,它保持唯一性和秩序:
Set<myEnum> myEnums = new LinkedHashSet<>();
myEnums.add(myEnum.SPECIAL);
myEnums.add(myEnum.OTHER1);
myEnums.add(myEnum.SPECIAL); // SPECIAL is (silently) not added
如果订单实际上并不重要,只需使用HashSet
或enum
优化EnumSet
。
答案 3 :(得分:0)
使用EnumSet代替: EnumSet API