资讯专栏INFORMATION COLUMN

注解、泛型、枚举、Lambda表达式、JUnit单元测试

fireflow / 2597人阅读

摘要:注解之后新特性对元素进行说明包类字段方法局部变量,方法参数注解与注释的区别注解用特定格式名称说明程序,给计算机看的注释用文字说明程序,给程序员看的作用分类编写文档的注解生成文档写在注释中代码分析的注解对代码进行分析反射编译检查的注解进行编译

注解
1、JDK 1.5之后新特性
2、对元素进行说明(包、类、字段、方法、局部变量,方法参数)

注解与注释的区别

注解:用特定格式名称说明程序,给计算机看的

注释: 用文字说明程序,给程序员看的

作用分类

1、编写文档的注解:生成Apidoc文档(写在注释中)
2、代码分析的注解:对代码进行分析(反射)
3、编译检查的注解:进行编译检查(@override)

注解使用格式

@注解名称

编写文档:@since、@author、@version、@param、@return 一般都是JDK内置的,无法自定义
编译检查:@override 一般都是JDK内置的,无法自定义

JDK内置注解

@override 检查标注的方法是否是父类(接口)的方法
@Deprecated 标注过时
@SuppressWarnings 抑制警告提示,一般用法@SuppressWarnings("all")

自定义注解 —— 格式

元注解
public @interface 注解名称{
    属性列表;
}

自定义注解 —— 本质

自定义注解 本质上就是一个接口,默认继承Annotation接口,所谓属性列表就是抽象方法

自定义注解 —— 属性返回值的数据类型

基本数据类型
String
注解
枚举
以上类型的数组

@MyAnno(value=12,per=Sex.MAN,anno=@person,name="wt")

自定义注解 —— 在使用时属性赋值

1、定义属性默认值,使用关键字default,使用注解时,可以不用属性赋值
2、如果注解中只定义到一个属性,而且属性名为value,则value可以省略
3、属性的数据类型为数组时,值使用{}包裹,如果数组中只有一个值,则{}可以省略

自定义注解 —— 元注解

元注解:用于描述注解的注解,JDK内置
    @Target:描述注解作用的位置
    @Retention: 描述注解被保留到哪个阶段
    @Documented:描述注解是否被提取到api文档中
    @Inherited:描述注解是否被子类继承

@Target

ElementType取值:
TYPE:可以作用于类上
METHOD:可以作用于方法上
FIELD:可以作用于成员属性上

@Retention

SOURCE:编译检测
CLASS:注解会保留到class字节码中,不被JVM读取
RUNTIME:注解会保留到class字节码中,被JVM读取

自定义注解 —— 解析

//不使用注解
//1、加载配置文件
//创建Properties对象
Properties pro = new Properties();
//加载配置文件,转化为一个流
//获取classes目录下的配置文件
ClassLoader classLoader = Person.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("pro.properties");
pro.load(is);

//2、获取配置文件中数据
String className = pro.getProperty("className");
String methodName = pro.getProperty("methodName");
//1、获取字节码文件对象
Class p = Person.class;
Pro an = p.getAnnotation(Pro.class);
//2、获取配置文件中数据
String className = an.className();
String methodName = an.methodName();
//使用注解
Person p = new Person();
//1、获取字节码文件对象
Class cls = p.getClass();
//2、获取所有方法
Method[] methods = cls.getMethods();
//3、判断方法上是否有注解
for(Method method : methods){
    if(method.isAnnotationPresent(Check.class)){
        try{
            mothed.invoke(p)
        } catch(Exception e) {
        
        }
    }
}
泛型
是一种未知的数据类型,当我们定义时不知使用什么数据类型,就可以使用泛型
E e:Element 元素 (这只是语义化定义,你随便定义字母都可以,A/B/C/D...,除问号)
T t:Type 类型 (这只是语义化定义,你随便定义字母都可以,A/B/C/D...,除问号)
集合大量使用泛型

作用

灵活地将数据类型应用到不同的类、方法、接口中去,将数据类型作为参数进行传递

对于集合来说
1、无需再转数据类型
2、运行期的异常提前到编译期
3、集合存储数据类型受到限制

定义

// 定义一个含有泛型的类
public class GenericClass {
    private E name;
    
    public E getName(){
        return this.name;
    }
    
    public void setName(E name){
        this.name = name;
    }
}

// 定义一个含有泛型的方法
public static  E test(E e){
    return e;
}

public  E test(E e){
    return e;
}

// 定义一个带有泛型的接口
public interface GenericClass{
    public abstract void test(E e);
}

使用

使用时才确定数据类型,如果不指定,默认就是Object类型
// 含有泛型的类使用
GenericClass gc = new GenericClass();
String name = gc.getName();

// 含有泛型的方法使用(调用方法的时候才确定数据类型)
GenericClass.test("123");

// 含有泛型的接口使用(有2种方法)
1、继承时确定类型
public class GernericClassImpl implements GenericClass{
    public String test(String e){
        return e;
    }
}

2、创建对象时确定类型
public class GernericClassImpl implements GenericClass{
    public E test(E e){
        return e;
    }
}

GernericClassImpl gc = new GernericClassImpl();

通配符

通配符 (与要区分)
用途:
1、不能用于定义类、接口,不能用于创建对象
2、只能用于方法传参和方法返回值
List list1 = new ArrayList();
List list2 = new ArrayList();

public void test(List list){
     Iterator it = list.iterator();
     while(it.hasNext()){
          Object ob = it.next();  // 由于传入的类型要调用方法才能确定所以获取的都是Object类型
          System.out.println(ob);
     }
}

public List test(){}
高级使用:
泛型的上限限定(子类及本身) : 
泛型的下限限定(父类及本身) :  
JUnit单元测试
测试分为 黑盒测试白盒测试JUnit 属于 白盒测试

以前测试做法

创建2个类文件:
一个是业务类UserService
另一个是业务类对应的测试类UserServiceTest

测试类UserServiceTest主要使用main方法进行测试,由于一个类中只存在一个main方法,所以如果你要测试多个方法,测试很繁琐

JUnit单元测试做法

步骤:
1、定义一个测试类(测试用例)
建议:
测试类包名(类的包名.test)
测试类名(类名+Test)

2、定义一个测试方法
测试方法名(test+被测试的方法名,例如:testAdd)
测试方法返回值(void)
测试方法传参(空)

3、给方法增加@Test
4、添加预言(建议不要使用打印控制台system.out.println)

补充

@Before : 修饰的方法会在测试方法之前会被自动执行,一般用于资源的申请
@After : 修饰的方法会在测试方法之后会被自动执行,一般用于资源的释放
枚举
枚举类、接口 同级,其实枚举也是一个类,只是该类的对象给限定了(定义在第一行)
枚举JDK1.5带来的新特性

作用

让一个类的对象是有限且固定,例如性别:不是男就是女

定义枚举

public enum Sex{
    MALE,FEMALE;
}

public enum Sex {
    MALE("男"),FEMALE("女");

    private final String name;
    
    private Sex(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71579.html

相关文章

  • 《 Kotlin + Spring Boot : 下一代 Java 服务端开发 》

    摘要:下一代服务端开发下一代服务端开发第部门快速开始第章快速开始环境准备,,快速上手实现一个第章企业级服务开发从到语言的缺点发展历程的缺点为什么是产生的背景解决了哪些问题为什么是的发展历程容器的配置地狱是什么从到下一代企业级服务开发在移动开发领域 《 Kotlin + Spring Boot : 下一代 Java 服务端开发 》 Kotlin + Spring Boot : 下一代 Java...

    springDevBird 评论0 收藏0
  • 第12章 元编程与注解、反射 《Kotlin 项目实战开发》

    摘要:第章元编程与注解反射反射是在运行时获取类的函数方法属性父类接口注解元数据泛型信息等类的内部信息的机制。本章介绍中的注解与反射编程的相关内容。元编程本质上是一种对源代码本身进行高层次抽象的编码技术。反射是促进元编程的一种很有价值的语言特性。 第12章 元编程与注解、反射 反射(Reflection)是在运行时获取类的函数(方法)、属性、父类、接口、注解元数据、泛型信息等类的内部信息的机...

    joyqi 评论0 收藏0
  • Javag工程师成神之路(2019正式版)

    摘要:结构型模式适配器模式桥接模式装饰模式组合模式外观模式享元模式代理模式。行为型模式模版方法模式命令模式迭代器模式观察者模式中介者模式备忘录模式解释器模式模式状态模式策略模式职责链模式责任链模式访问者模式。 主要版本 更新时间 备注 v1.0 2015-08-01 首次发布 v1.1 2018-03-12 增加新技术知识、完善知识体系 v2.0 2019-02-19 结构...

    Olivia 评论0 收藏0
  • Java程序设计笔记

    摘要:对象的自动清除对象回收是由垃圾回收线程负责方法可以要求系统进行垃圾回收,仅仅是建议系统没有析构方法,但的有类似方法系统在回收时会自动调用对象的方法子类的方法可以在里面释放系统资源,一般来说,子类的方法中应该调用父类的方法。 对象的自动清除 对象回收是由垃圾回收线程负责 System.gc()方法可以要求系统进行垃圾回收,仅仅是建议系统 java没有析构方法,但Object的final...

    microcosm1994 评论0 收藏0
  • java-Annotation注解

    摘要:指定该策略的注解只能修饰成员变量。也可以在定义注解的成员变量时为其指定初始值,指定默认值。根据注解是否可以包含成员变量,可以把注解分为标记注解没有定义成员变量的注解类型被称为标记。 @Override 是告诉编译器检查这个方法,保证父类要包含一个被该方法重写的方法,否则编译出错。 只能修饰方法,不能修饰其他程序元素 。 Java 9 增强的@Deprecated 表示某个程...

    skinner 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<