1.定义一个Bean
public class UserDO { private Integer id; private String userName; private String sex; private Integer age; public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } }
定义了一个UserDO, 类中提供了属性的setter,setter方法. 这么多的setter ,getter方法,看起来是不是很蛋疼, lombok可以帮我们优化.
2. lombok的基本功能
@Setter @Getter public class UserDO { private Integer id; private String userName; private String sex; private Integer age; }
看到没有,仅仅使用@Setter, @Getter两个注解,就帮我们干掉了繁人的getter,setter方法, 是不是很强大.
但是仅仅是@Setter, @Getter两个注解还是不能体现出lombok的强大, 我们完全可以使用@Data一个注解去替换@Setter和@Getter
代码如下
import lombok.Data; @Data public class UserDO { private Integer id; private String userName; private String sex; private Integer age; }
当然,lombok除了对getter,setter方法做了优化之外,还对构造器做了定义
@Data @AllArgsConstructor // 全参构造器 @NoArgsConstructor // 无参构造器 public class UserDO { private Integer id; private String userName; private String sex; private Integer age; }
3. 链式编程
public class UserDO { private Integer id; private String userName; private String sex; private Integer age; public Integer getId() { return id; } public UserDO setId(Integer id) { this.id = id; return this; } public String getUserName() { return userName; } public UserDO setUserName(String userName) { this.userName = userName; return this; } public String getSex() { return sex; } public UserDO setSex(String sex) { this.sex = sex; return this; } public Integer getAge() { return age; } public UserDO setAge(Integer age) { this.age = age; return this; } }
使用链式编程, 我们可这样操作
UserDO userDO = new UserDO(); userDO.setUserName("郑钦锋").setAge(215).setId(1).setSex("男");
上述的链式编程,看起来肯定比传统的set属性值要优雅一点吧.
而lombok正好也为我们提供了链式编程功能, 仅须添加@Accessors(chain = true)注解即可.
@Accessors(chain = true) @Data public class UserDO { private Integer id; private String userName; private String sex; private Integer age; }
测试
public class UserDOTest { public static void main(String[] args) { UserDO userDO = new UserDO(); userDO.setUserName("郑钦锋").setAge(215).setId(1).setSex("男"); System.out.println(userDO); //UserDO(id=1, userName=郑钦锋, sex=男, age=215) } }
是不是很赞!
4. 创建实例
通过new的方式创建一个实例是不是有点不显逼格.
guava中创建List集合可以使用以下这种方式
List<String> list = Lists.newArrayList();
刚好,lombok也提供了类似的功能,请看
import lombok.Data; import lombok.RequiredArgsConstructor; import lombok.experimental.Accessors; @Accessors(chain = true) @Data // 通过@RequiredArgsConstructor注解创建实例 @RequiredArgsConstructor(staticName = "of") public class UserDO { private Integer id; private String userName; private String sex; private Integer age; }
测试代码
public class UserDOTest { public static void main(String[] args) { UserDO userDO = UserDO.of().setUserName("郑钦锋").setSex("男"); UserDO userDO1 = UserDO.of().setUserName("郑钦锋").setSex("男").setId(1); System.out.println(userDO.hashCode()); System.out.println(userDO1.hashCode()); System.out.println(userDO == userDO1); // false System.out.println(userDO); System.out.println(userDO1); } }
直接通过类名.of()就创建了一个实例!
5. builder模式
对于复杂对象的创建, 我们一般都会使用builder设计模式,请看示例
public class UserDO { private Integer id; private String userName; private String sex; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public static Builder builder() { return new Builder(); } public static class Builder { private Integer id; private String userName; private String sex; private Integer age; public Builder userName(String userName) { this.userName = userName; return this; } public Builder id(Integer id) { this.id = id; return this; } public Builder age(Integer age) { this.age = age; return this; } public Builder sex(String sex) { this.sex = sex; return this; } public UserDO build() { UserDO userDO = new UserDO(); userDO.setId(id); userDO.setAge(age); userDO.setSex(sex); userDO.setUserName(userName); return userDO; } } @Override public String toString() { return "UserDO{" + "id=" + id + ", userName='" + userName + '\'' + ", sex='" + sex + '\'' + ", age=" + age + '}'; } }
测试代码
public class UserDOTest { public static void main(String[] args) { UserDO userDO = UserDO.builder().id(1).userName("郑钦锋").age(13).sex("hfdk").build(); System.out.println(userDO); //UserDO{id=1, userName='郑钦锋', sex='hfdk', age=13} } }
Builder类中的代码之复杂,一看就明白. lombok对些做了优化, 使用起来很简单. 请看示例
import lombok.Builder;
import lombok.ToString;
@ToString // 方便打印
@Builder
public class UserDO {
private Integer id;
private String userName;
private String sex;
private Integer age;
}
测试代码
public class UserDOTest { public static void main(String[] args) { UserDO userDO = UserDO.builder().id(1).userName("郑钦锋").age(13).sex("hfdk").build(); System.out.println(userDO); //UserDO(id=1, userName=郑钦锋, sex=hfdk, age=13) } }
一个@Builder注解替换了一大段代码, 你说牛逼不牛逼
6. 代理模式
先来一个原始的代码实现
public interface UserOperations { void eat() throws Exception; void drink() throws Exception; }
/** * 真正干事的类 */ public class RealOperations { public void eat() throws Exception { System.out.println("吃饭!"); } public void drink() throws Exception { System.out.println("喝水!"); } }
/** * 代理类 */ public abstract class DelegateOperations implements UserOperations { private RealOperations realOperations; /** * 通过构造器传参 * * @param realOperations */ protected DelegateOperations(RealOperations realOperations) { this.realOperations = realOperations; } @Override public void eat() throws Exception { realOperations.eat(); } @Override public void drink() throws Exception { realOperations.drink(); } }
public class XiaoMingOperation extends DelegateOperations { public XiaoMingOperation(RealOperations realOperations) { super(realOperations); } }
测试代码
public class Test { public static void main(String[] args) throws Exception { RealOperations realOperations = new RealOperations(); XiaoMingOperation xiaoMingOperation = new XiaoMingOperation(realOperations); xiaoMingOperation.eat(); xiaoMingOperation.drink(); } }
上述代码代理类 DelegateOperations是不是屁事都没有做, 如果 UserOperations 接口中方法很多, 那么DelegateOperations的实现是不是很烦人. lombok可以帮我们简单代码.请看下面代码
/** * 代理类 */ @AllArgsConstructor public abstract class DelegateOperations implements UserOperations { @Delegate private RealOperations realOperations; }
两个注解搞定, 代码看起来是不是清爽很多. 经测试,完全没有毛病.