常用类 | Others

1.比较器

  1. 对象正常只能==、!=比较,但不能使用 < 和 >
  2. 真实开发中,有时候需要对多个对象进行排序,就需要比较对象大小
  3. Comparable自然排序 用于类继承长期使用
  4. 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
//1.实现Comparable接口(属性/set/get方法略)
public class Goods implements Comparable {
//2.按照价格从低到高,产品名称从高到低
@Override
public int compareTo(Object o){
if (o instanceof Goods){
Goods goods = (Goods)o;
//3.当前对象大于形参 输出正数
if (this.price > goods.price){
return 1;
//4.当前对象小于形参 输出负数
}else if (this.price < goods.price){
return -1;
}else {
//若存在相同价钱 用名称字母进行比较来排序
//默认为从低到高进行排序 加个-就是反向操作
return -this.name.compareTo(goods.name);
}
}
throw new RuntimeException("类型不一致");
}
}
//具体实现可以新建Goods数组对象
//然后通过Arrays的sort和toString方法对它进行遍历

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) {
}
}
//使用体现
//按照产品名称从低到高,再按照价格从高到低
//1.sort为排序,new Comparator里面为排序规则(匿名接口)
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;
//1若商品名称相同
if (goods1.getName().equals(goods2.getName())){
//2商品价格从高到低排列
return -Double.compare(goods1.getPrice(),goods2.getPrice());
}else {
//3名称不同时,商品价格从高到低
return goods1.getName().compareTo(goods2.getName());
}
}
throw new RuntimeException("类型不一致");
}

});
System.out.println(Arrays.toString(goods));

2.枚举类

  1. 类的对象是有限个,且确定的
  2. 当需要定义一组常量时,可使用枚举类
  3. 当枚举类只有一个对象时,就是单例设计模式
  4. 枚举类提高了开发效率,减少了代码量
  5. 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() {略}
}

//有了enum没有属性的情况下
//具体体现看项目三
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等等
框架就是基于注解+反射+设计模式
开发中使用

  1. 文档注解:author param date等等
  2. 编译时注解:Override Deprecated SuppressWaarnings等等
  3. 跟踪代码依赖性,替代了配置文件功能,如Servlet3.0中
  4. String框架事务的管理
  5. 注解真正的意义要通过反射去实现,单独定义注解无意义

3.1自定义注解

  1. 注解声明为:@interface
  2. 内部定义成员,通常使用value表示
  3. 可使用default指定内部成员默认值
  4. 若自定义注解无成员,表明为一个标识
  5. 使用时,若注解有成员,需指明成员的值
  6. 自定义注意要配上信息流程(反射讲)才有意义
    1
    2
    3
    4
    public @interface MyAnnotation {
    //default用于指定默认值
    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 {
//default用于指定默认值
String value() default "我的接口";
}
//第二个注解
@Target({TYPE, FIELD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotationII {
MyAnnotation[] value();
}

3.4类型注解JDK8

  1. 元注解@Target的枚举类ElementTarget中多了两个值
  2. TYPE_PARAMETER标识该注解可写在类型变量的声明语句中
  3. TYPE_USE可写在使用类型的任何语句中
  4. JDK1.9又提供了MODULE,用于对模块的注解

常用类 | Others
http://example.com/2022/05/18/Java初级部分/NormalClass/其他常用类/
Author
John Doe
Posted on
May 18, 2022
Licensed under