lqxue

常用链接

统计

book

tools

最新评论

[收集]java5 的一些的性

@SuppressWarnings与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数值都是已经定义好了的,我们选择性的使用就好了,参数如下:

参数

语义

deprecation

使用了过时的类或方法时的警告

unchecked

执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型

fallthrough

Switch 程序块直接通往下一种情况而没有 Break 时的警告

path

在类路径、源文件路径等中有不存在的路径时的警告

serial

当在可序列化的类上缺少 serialVersionUID 定义时的警告

finally

任何 finally 子句不能正常完成时的警告

all

关于以上所有情况的警告

   

Override

  Override表示,它所注释的方法应该重写超类中具有相同签名的方法:
@Override

  public int hashCode() {

  ...

  }


  看上面的例子,如果没有在hashCode中将“C”大写,在编译时不会出现错误,但是在运行时将无法像期望的那样调用该方法。通过添加Override标签,编译器会提示它是否真正地执行了重写。

  在超类发生改变的情况中,这也很有帮助。如果向该方法中添加一个新参数,而且方法本身也被重命名了,那么子类将突然不能编译,因为它不再重写超类的任何东西。

枚举

  


  enum非常像public static final int声明,后者作为枚举值已经使用了很多年。对int所做的最大也是最明显的改进是类型安全――您不能错误地用枚举的一种类型代替另一种类型,这一点和int不同,所有的int对编译器来说都是一样的。除去极少数例外的情况,通常都应该用enum实例替换全部的枚举风格的int结构。

  枚举提供了一些附加的特性。EnumMap和EnumSet这两个实用类是专门为枚举优化的标准集合实现。如果知道集合只包含枚举类型,那么应该使用这些专门的集合来代替HashMap或HashSet。

  大部分情况下,可以使用enum对代码中的所有public static final int做插入替换。它们是可比的,并且可以静态导入,所以对它们的引用看起来是等同的,即使是对于内部类(或内部枚举类型)。注意,比较枚举类型的时候,声明它们的指令表明了它们的顺序值。

  “隐藏的”静态方法

  两个静态方法出现在所有枚举类型声明中。因为它们是枚举子类上的静态方法,而不是Enum本身的方法,所以它们在java.lang.Enum的javadoc中没有出现。

  第一个是values(),返回一个枚举类型所有可能值的数组。

  第二个是valueOf(),为提供的字符串返回一个枚举类型,该枚举类型必须精确地匹配源代码声明。

  方法

  关于枚举类型,我们最喜欢的一个方面是它可以有方法。过去您可能需要编写一些代码,对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)

 Log.log(String code, String... args)
协变返回

  协变返回的基本用法是用于在已知一个实现的返回类型比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();

参考:http://www.linuxpk.com/43834.html

posted on 2007-10-23 17:15 lqx 阅读(744) 评论(0)  编辑  收藏 所属分类: java


只有注册用户登录后才能发表评论。


网站导航: