正 文

体验Java 5.0的新增语言特性


www.7dspace.com  更新日期:2006-1-7 3:40:33  七度空间


  方法

  关于枚举类型,我们最喜欢的一个方面是它可以有方法。过去您可能需要编写一些代码,对public static final int进行转换,把它从数据库类型转换为JDBC URL。而现在则可以让枚举类型本身带一个整理代码的方法。下面就是一个例子,包括DatabaseType枚举类型的抽象方法以及每个枚举实例中提供的实现:

  public enum  DatabaseType {
  ORACLE {
  public String getJdbcUrl() {...}
  },
  MYSQL {
  public String getJdbcUrl() {...}
  };
  public abstract String getJdbcUrl();
  }

  现在枚举类型可以直接提供它的实用方法。例如:

DatabaseType dbType = ...;
String jdbcURL = dbType.getJdbcUrl();

  要获取URL,必须预先知道该实用方法在哪里。

  可变参数(Vararg)

  正确地使用可变参数确实可以清理一些垃圾代码。典型的例子是一个带有可变的String参数个数的log方法:

    Log.log(String code)
    Log.log(String code,  String arg)
    Log.log(String code,  String arg1, String arg2)
    Log.log(String code,  String[] args)

  当讨论可变参数时,比较有趣的是,如果用新的可变参数替换前四个例子,将是兼容的:

Log.log(String code, String... args)

  所有的可变参数都是源兼容的——那就是说,如果重新编译log()方法的所有调用程序,可以直接替换全部的四个方法。然而,如果需要向后的二进制兼容性,那么就需要舍去前三个方法。只有最后那个带一个字符串数组参数的方法等效于可变参数版本,因此可以被可变参数版本替换。

  类型强制转换

  如果希望调用程序了解应该使用哪种类型的参数,那么应该避免用可变参数进行类型强制转换。看下面这个例子,第一项希望是String,第二项希望是Exception:

    Log.log(Object...  objects) {
    String message = (String)objects[0];
    if (objects.length > 1) {
    Exception e = (Exception)objects[1];
    // Do something with the exception
    }
    }

  方法签名应该如下所示,相应的可变参数分别使用String和Exception声明:

Log.log(String message, Exception e, Object... objects) {...}

  不要使用可变参数破坏类型系统。需要强类型化时才可以使用它。对于这个规则,PrintStream.printf()是一个有趣的例外:它提供类型信息作为自己的第一个参数,以便稍后可以接受那些类型。

  协变返回

  协变返回的基本用法是用于在已知一个实现的返回类型比API更具体的时候避免进行类型强制转换。在下面这个例子中,有一个返回Animal对象的Zoo 接口。我们的实现返回一个AnimalImpl对象,但是在JDK 1.5之前,要返回一个Animal对象就必须声明。:

    public interface Zoo  {
    public Animal getAnimal();
    }
  public class ZooImpl  implements Zoo {
  public Animal getAnimal(){
  return new AnimalImpl();
  }
  }

  协变返回的使用替换了三个反模式:

    * 直接字段访问。为了规避API限制,一些实现把子类直接暴露为字段: ZooImpl._animal

    * 另一种形式是,在知道实现的实际上是特定的子类的情况下,在调用程序中执行向下转换: ((AnimalImpl)ZooImpl.getAnimal()).implMethod();

    * 我看到的最后一种形式是一个具体的方法,该方法用来避免由一个完全不同的签名所引发的问题:ZooImpl._getAnimal();

  这三种模式都有它们的问题和局限性。要么是不够整洁,要么就是暴露了不必要的实现细节。

  协变

  协变返回模式就比较整洁、安全并且易于维护,它也不需要类型强制转换或特定的方法或字段:

public AnimalImpl getAnimal(){
return new AnimalImpl();
}

  使用结果:

ZooImpl.getAnimal().implMethod();

  使用泛型

  我们将从两个角度来了解泛型:使用泛型和构造泛型。我们不讨论List、Set和Map的显而易见的用法。知道泛型集合是强大的并且应该经常使用就足够了。

3页,页码:[1] [2] [3] 

上一篇:它是最适合的 我热爱Spring的五个理由
下一篇:.NET可复用TCP通信层之消息分派器组件
作者:Jess Garms, Tim Hanson  来源:bea ( 责任编辑:7dspace )
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐