您的位置:首页 > 编程语言 > Java开发

21.JAVA编程思想——未支持的操作

2016-04-17 09:24 323 查看
21.JAVA编程思想——未支持的操作

利用static(静态)数组Arrays.toList(),也许能将一个数组转换成List

1     代码如下

import java.util.*;

 

public
class
Unsupported {

    private
static
String[] s= {
"one","two","three","four","five","six","seven","eight","nine","ten",};

    static
List a = Arrays.asList(s);

    static
List a2 = Arrays.asList(new String[] {
s[3], s[4],s[5]});

 

    public
staticvoid
main(String[]
args){

        Collection1.print(a);
// Iteration

        System.out.println("a.contains(" +
s[0] + ") = "+
a.contains(s[0]));

        System.out.println("a.containsAll(a2) = " +
a.containsAll(a2));

        System.out.println("a.isEmpty() = " +
a.isEmpty());

        System.out.println("a.indexOf(" +
s[5] + ") = "+
a.indexOf(s[5]));

        // Traverse backwards:

        ListIterator
lit = a.listIterator(a.size());

        while (lit.hasPrevious())

            System.out.print(lit.previous());

        System.out.println();

        // Set the elements to different values:

        for (int
i = 0; i <
a.size(); i++)

            a.set(i,
"47")
;

        Collection1.print(a);

        // Compiles, but won't run:

        lit.add("X");
// Unsupported operation

        a.clear();
// Unsupported

        a.add("eleven");
// Unsupported

        a.addAll(a2);
// Unsupported

        a.retainAll(a2);
// Unsupported

        a.remove(s[0]);
// Unsupported

        a.removeAll(a2);
// Unsupported

    }

} /// :~

2     执行结果

onetwo three four five six seven eight nine ten

a.contains(one)= true

a.containsAll(a2)= true

a.isEmpty()= false

a.indexOf(six)= 5

tennineeightsevensixfivefourthreetwoone

4747 47 47 47 47 47 47 47 47

Exceptionin thread "main"
java.lang.UnsupportedOperationException

    at java.util.AbstractList.add(UnknownSource)

    atjava.util.AbstractList$ListItr.add(Unknown Source)

    at Unsupported.main(Unsupported.java:24)

3     说明

从中可以看出,实际只实现了Collection 和List 接口的一部分。剩余的方法导致了不受欢迎的一种情况,名为UnsupportedOperationException。

这里的关键在于“集合接口”,以及新集合库内的另一些接口,它们都包含了“可选的”方

法。在实现那些接口的集合类中,或者提供、或者没有提供对那些方法的支持。若调用一个未获支持的方法,就会导致一个UnsupportedOperationException(操作未支持违例),这表明出现了一个编程错误。不是说“接口”和基础类最大的“卖点”就是它们许诺这些方法能产生一些有意义的行为吗?上述违例破坏了那个许诺——它调用的一部分方法不仅不能产生有意义的行为,而且还会中止程序的运行。在这些情况下,类型的所谓安全保证似乎显得一钱不值!但是,情况并没有想象的那么坏。通过Collection,List,Set
或者Map,编译器仍然限制我们只能调用那个接口中的方法,所以它和Smalltalk 还是存在一些区别的(在Smalltalk 中,可为任何对象调用任何方法,而且只有在运行程序时才知道这些调用是否可行)。除此以外,以Collection 作为自变量的大多数方法只能从那个集合中读取数据——Collection的所有“read”方法都不是可选的。

这样一来,系统就可避免在设计期间出现接口的冲突。而在集合库的其他设计方案中,最终经常都会得到数量过多的接口,用它们描述基本方案的每一种变化形式,所以学习和掌握显得非常困难。有些时候,甚至难于捕捉接口中的所有特殊情况,因为人们可能设计出任何新接口。但Java 的“不支持的操作”方法却达到了新集合库的一个重要设计目标:易于学习和使用。但是,为了使这一方法真正有效,却需满足下述条件:

(1)UnsupportedOperationException 必须属于一种“非常”事件。也就是说,对于大多数类来说,所有操作都应是可行的。只有在一些特殊情况下,一、两个操作才可能未获支持。新集合库满足了这一条件,因为绝大多数时候用到的类——ArrayList,LinkedList,HashList 和HashMap,以及其他集合方案——都提供了对所有操作的支持。但是,如果想新建一个集合,同时不想为集合接口中的所有方法都提供有意义的定义,同时令其仍与现有库配合,这种设计方法也确实提供了一个“后门”可以利用。

(2) 若一个操作未获支持,那么UnsupportedOperationException(未支持的操作违例)极有可能在实现期间出现,则不是在产品已交付给客户以后才会出现。它毕竟指出的是一个编程错误——不正确地使用了一个类。这一点不能十分确定,通过也可以看出这种方案的“试验”特征——只有经过多次试验,才能找出最理想的工作方式。

Arrays.toList()产生了一个List(列表),该列表是由一个固定长度的数组后推出来的。因此唯一能够支持的就是那些不改变数组长度的操作。在另一方面,若请求一个新接口表达不同种类的行为(可能叫作“FixedSizeList”——固定长度列表),就有遭遇更大的复杂程度的危险。这样一来,以后试图使用库的时候,很快就会发现自己不知从何处下手。对那些采用Collection,List,Set 或者Map 作为参数的方法,它们的文档应当指出哪些可选的方法是必须实现的。举个例子来说,排序要求实现set()和Iterator.set()方法,但不包括add()和remove()。

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: