你应该在Java中扩展ArrayList

时间:2018-06-07 23:18:25

标签: java arraylist

我有一个枚举的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

有更好的方法还是可以接受?

4 个答案:

答案 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

如果订单实际上并不重要,只需使用HashSetenum优化EnumSet

答案 3 :(得分:0)

使用EnumSet代替: EnumSet API