1.比较器
- 对象正常只能==、!=比较,但不能使用 < 和 >
- 真实开发中,有时候需要对多个对象进行排序,就需要比较对象大小
- Comparable自然排序 用于类继承长期使用
- Comparator定制排序 用于临时比较,不影响原本排序规则
1.1Comparable
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public class Goods implements Comparable { @Override public int compareTo(Object o){ if (o instanceof Goods){ Goods goods = (Goods)o; if (this.price > goods.price){ return 1; }else if (this.price < goods.price){ return -1; }else { return -this.name.compareTo(goods.name); } } throw new RuntimeException("类型不一致"); } }
|
1.2Comparator
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| Comparator bjq = new Comparator() { @Override public int compare(Object o1, Object o2) { } }
Arrays.sort(goods,new Comparator() { @Override public int compare(Object o1, Object o2) { if (o1 instanceof Goods && o2 instanceof Goods){ Goods goods1 = (Goods)o1; Goods goods2 = (Goods)o2; if (goods1.getName().equals(goods2.getName())){ return -Double.compare(goods1.getPrice(),goods2.getPrice()); }else { return goods1.getName().compareTo(goods2.getName()); } } throw new RuntimeException("类型不一致"); }
}); System.out.println(Arrays.toString(goods));
|
2.枚举类
- 类的对象是有限个,且确定的
- 当需要定义一组常量时,可使用枚举类
- 当枚举类只有一个对象时,就是单例设计模式
- 枚举类提高了开发效率,减少了代码量
- enum类提供了少量常用方法,具体使用可查看JAVA API
2.1 JDK5前后对比
JDK1.5前
属性和构造器私有化
若有属性,对属性进行初始化
对外提供常量调用(单例体现)
根据需要可提供get方法和toString
JDK1.5后
使用enum关键词代替class
属性和构造器私有化
若有属性,对属性进行初始化
对外提供常量调用格式:
常量1,常量2,常量3;
2.2代码体现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class UserEnum { <1>private final String seasonName; private final String seasonDesc;
<2>private UserEnum(String seasonName, String seasonDesc) { this.seasonName = seasonName; this.seasonDesc = seasonDesc; }
<3>public static final UserEnum SPRING = new UserEnum("春天","大地复苏");
<4>public String getSeasonName() { return seasonName; }
public String getSeasonDesc() { return seasonDesc; } @Override public String toString() {略} }
public enum Status{ FREE,BUSY,VACATION; }
|
Github Project:项目三
2.3实现接口
使用enum关键词的类依然可以实现接口
同时类中的每个常量可以分别实现接口
1 2 3 4 5 6 7
| enum Test implements myjk { FREE{ public void show(){ System.out.println("枚举类常量实现接口"); } }; }
|
3.注解
注解概述
JDK1.5新增一组特殊的标记,例如override、author等等
框架就是基于注解+反射+设计模式
开发中使用
- 文档注解:author param date等等
- 编译时注解:Override Deprecated SuppressWaarnings等等
- 跟踪代码依赖性,替代了配置文件功能,如Servlet3.0中
- String框架事务的管理
- 注解真正的意义要通过反射去实现,单独定义注解无意义
3.1自定义注解
- 注解声明为:@interface
- 内部定义成员,通常使用value表示
- 可使用default指定内部成员默认值
- 若自定义注解无成员,表明为一个标识
- 使用时,若注解有成员,需指明成员的值
- 自定义注意要配上信息流程(反射讲)才有意义
1 2 3 4
| public @interface MyAnnotation { String value() default "我的接口"; }
|
3.2元注解
元注解即用于修饰其他注解的注解
常用元注解
Retention:
用于指定Annotation的生命周期(SOURCE\CLASS\RUNTIME)
只有声明为RUNTIME时,才能通过反射获取
Target:
用于指定被修饰annotation元素能用于修饰哪些程序元素
同时它本省也包含了一个名为value的成员变量
Documented:
被修饰的注解被javadoc解析时,保留下来
具体体现可参考Date类的API文档
Inherited:
被修饰注解就具有继承性,通过反射获取信息
3.3可重复注解JDK8
在注解1上面声明Repeatable(注解2.class)
两个注解的Target和Retention等元注解都要相同
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Inherited @Repeatable(MyAnnotationII.class) @Target({TYPE, FIELD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE}) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { String value() default "我的接口"; }
@Target({TYPE, FIELD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE}) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotationII { MyAnnotation[] value(); }
|
3.4类型注解JDK8
- 元注解@Target的枚举类ElementTarget中多了两个值
- TYPE_PARAMETER标识该注解可写在类型变量的声明语句中
- TYPE_USE可写在使用类型的任何语句中
- JDK1.9又提供了MODULE,用于对模块的注解