近期改造项目,对接口返回数据转化的bean的属性进行命名时进行了一些调整,即对于后台返回的字段我们并不能做到见名知义,所以进行了注解。同时也省去了get、set方法,将属性声明为public,原来需要用get方法直接用新建bean的对象,然后使用对象.属性的方法,一定程度上减少了代码的冗余。
这里先给出一段代码看下:
public class LoginIntentInfo implements Serializable {
public String account;
public String loginType;
public String password;
}
通常对于这种bean我们都是使用GsonFormat自动生成的,然后直接给所有属性get、set方法,偷懒的做法(不管它能不能用上,反正需要的时候我们肯定都能调出来),肯定是没有问题的,而我这样把属性声明,且不使用get、set方法,需要使用时直接使用对象.属性,这样感觉代码会比较简洁。这里先简单说下这个,感觉这样看起来会舒服点的可以去试试。
注解的定义
见名知义,注解应该就是注释、解释的意思了。官方走一波,及百度,直接给链接了。
注解的认识和学习
@SerializedName进行注解
首先我们明确一下这个注解是用来干嘛的?为什么要用?怎么用?
一个一个解决,它是用来给属性取个 别名 的,而在使用中和原名并不冲突;使用它的原因是因为我们使用后台返过来的数据和我们自己定义的属性可能有差别(毕竟你可能是拼音而别人用的是英语),这个时候你要想用的舒服,你就可以使用这个了;具体怎么用,我们下面用代码来展示一下。
假如后台给你这么一段json代码:
{
"id":"1"
"n":"zhangsan"
"p":"123456"
"s":"0"
}
正常解析下:
public class User{
private String id;
private String n;
private String p;
private String s;
}
不知道是啥吧?没事,后台给了文档,name、password、sex。如果我们直接这么使用的话,看起来会比较难以理解,这个时候我们就可以使用注解了。
public class User{
private String id;
@SerializedName("n")
private String userName;
@SerializedName("p")
private String password;
@SerializedName("s")
private String sex;
}
然后我们就可以直接使用sex这些了,对于代码的阅读有了很好的帮助。
深入看看
我们直接点进去看下这个@SerializedName是个啥
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
public @interface SerializedName {
/**
* @return the desired name of the field when it is serialized or deserialized
*/
String value();
/**
* @return the alternative names of the field when it is deserialized
*/
String[] alternate() default {};
}
@interface是定义注解的关键字;
value() 有注释:在序列化或反序列化所需的字段的名称;
alternate() 也有注释:另一种反序列化时的名称字段;
继续往上看,我们又发现了三个注解,我们逐一来看。
先看@Documented
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
@Document表示它本身也会被文档化;
Retention表示@Documented这个注解能保留到运行时;
@ElementType.ANNOTATION_TYPE表示@Documented这个注解只能够被用来描述注解类型。
RetentionPolicy、ElemenType都是枚举,我们一起来看下
public enum RetentionPolicy {
SOURCE,
CLASS,
RUNTIME
}
SOURCE:表示在编译时这个注解会被移除,不会包含在编译后产生的class文件中。
CLASS:表示这个注解会被包含在class文件中,但在运行时会被移除。
RUNTIME:表示这个注解会被保留到运行时,我们可以在运行时通过反射解析这个注解。(又看到反射了,我那边文章还没写呢,主要是我还没弄懂)
public enum ElementType {
TYPE,
FIELD,
METHOD,
PARAMETER,
CONSTRUCTOR,
LOCAL_VARIABLE,
ANNOTATION_TYPE,
PACKAGE,
TYPE_PARAMETER,
TYPE_USE
}
TYPE:类、接口、注解类型或枚举类型。
PACKAGE:注解包。
PARAMETER:注解参数。
ANNOTATION_TYPE:注解 注解类型。
METHOD:方法。
FIELD:属性(包括枚举常量)
CONSTRUCTOR:构造器。
LOCAL_VARIABLE:局部变量。
最常见的注解
@override
点进去了解一下
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
告诉编译器被修饰的方法是重写的父类中的相同签名的方法,编译器会对此做出检查,若发现父类中不存在这个方法或是存在的方法签名不同,则会报错。
这就是我们重写父类方法的时候为什么会有这个注解了,相信读完这篇文章,你就有所了解了。
@BindView
点进去了解一下
@Retention(CLASS) @Target(FIELD)
public @interface BindView {
/** View ID to which the field will be bound. */
@IdRes int value();
}
这里面的viewID,就是我们findviewbyid时的id。针对黄油刀,里面远远不是这么简单,这只是对注释一点皮毛。
写在最后
有啥不对的欢迎指出来,也欢迎加群一起交流学习 589780530