Lombok

来自ling
(重定向自Spring lombok
跳转至: 导航搜索

https://www.jianshu.com/p/2ea9ff98f7d6

自动get,set

@Data
public class BasicClusterInfo implements Serializable {
    private static final long serialVersionUID = 3478135817352393604L;
    private String            hbaseKey;
    private int               receiverCount;
}

eclipse https://blog.csdn.net/Dorothy1224/article/details/79280591/

Lombok的使用

       主要是基于标注来进行信息的封装和使用:

 @NonNull:  标识对象是否为空,为空则抛出异常

 @Getter:   自动生成Getter方法

 @Setter:  自动生成Setter

 @ToString:  覆盖tostring方法
 @EqualsAndHashCode: 覆盖equal和hashCode方法
 @Data:  @Getter/@Setter, @ToString, @EqualAndHashCode等组合
 @@NoArgsConstructor @AllArgsConstructor注解使用
 @Slf4j:  默认使用slf4j的日志对象

Lombok常用注解和功能

https://blog.csdn.net/qq_40081976/article/details/79139565 注解

val:用在局部变量前面,相当于将变量声明为final

  1. @NonNull:给方法参数增加这个注解会自动在方法内对该参数进行是否为空的校验,如果为空,则抛出NPE(NullPointerException)
  2. @Cleanup:自动管理资源,用在局部变量之前,在当前变量范围内即将执行完毕退出之前会自动清理资源,自动生成try-finally这样的代码来关闭流
  3. @Getter/#@Setter:用在属性上,再也不用自己手写setter和getter方法了,还可以指定访问范围
  4. @ToString:用在类上,可以自动覆写toString方法,当然还可以加其他参数,例如#@ToString(exclude=”id”)排除id属性,或者#@ToString(callSuper=true, includeFieldNames=true)调用父类的toString方法,包含所有属性
  5. @EqualsAndHashCode:用在类上,自动生成equals方法和hashCode方法
  6. @NoArgsConstructor, #@RequiredArgsConstructor and #@AllArgsConstructor:用在类上,自动生成无参构造和使用所有参数的构造函数以及把所有#@NonNull属性作为参数的构造函数,如果指定staticName = “of”参数,同时还会生成一个返回类对象的静态工厂方法,比使用构造函数方便很多
  7. @Data:注解在类上,相当于同时使用了#@ToString、#@EqualsAndHashCode、#@Getter、#@Setter和#@RequiredArgsConstrutor这些注解,对于POJO类十分有用
  8. @Value:用在类上,是#@Data的不可变形式,相当于为属性添加final声明,只提供getter方法,而不提供setter方法
  9. @Builder:用在类、构造器、方法上,为你提供复杂的builder APIs,让你可以像如下方式一样调用Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();更多说明参考Builder
  10. @SneakyThrows:自动抛受检异常,而无需显式在方法上使用throws语句
  11. @Synchronized:用在方法上,将方法声明为同步的,并自动加锁,而锁对象是一个私有的属性$lock或$LOCK,而java中的synchronized关键字锁对象是this,锁在this或者自己的类对象上存在副作用,就是你不能阻止非受控代码去锁this或者类对象,这可能会导致竞争条件或者其它线程错误
  12. @Getter(lazy=true):可以替代经典的Double Check Lock样板代码
  13. @Log:根据不同的注解生成不同类型的log对象,但是实例名称都是log,有六种可选实现类
    1. @CommonsLog Creates log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
    2. @Log Creates log = java.util.logging.Logger.getLogger(LogExample.class.getName());
    3. @Log4j Creates log = org.apache.log4j.Logger.getLogger(LogExample.class);
    4. @Log4j2 Creates log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
    5. @Slf4j Creates log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
    6. @XSlf4j Creates log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);

@CacheEvict @Cacheable

Spring Boot Cache + redis 设置有效时间和自动刷新缓存,时间支持在配置文件中配置

	@Cacheable(value = "menu_details", key = "#roleId  + '_menu'")
	public List<MenuVO> findMenuByRoleId(Integer roleId) {
		return baseMapper.listMenusByRoleId(roleId);
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	@CacheEvict(value = "menu_details", allEntries = true)
	public R removeMenuById(Integer id) {
		// 查询父节点为当前节点的节点
		List<SysMenu> menuList = this.list(Wrappers.<SysMenu>query()
				.lambda().eq(SysMenu::getParentId, id));
		if (CollUtil.isNotEmpty(menuList)) {
			return R.builder()
					.code(CommonConstants.FAIL)
					.msg("菜单含有下级不能删除").build();
		}

		sysRoleMenuMapper
				.delete(Wrappers.<SysRoleMenu>query()
						.lambda().eq(SysRoleMenu::getMenuId, id));

		//删除当前菜单及其子菜单
		return new R(this.removeById(id));
	}

	@Override
	@CacheEvict(value = "menu_details", allEntries = true)
	public Boolean updateMenuById(SysMenu sysMenu) {
		return this.updateById(sysMenu);
	}

@SneakyThrows

@SneakyThrows的用法比较简单,其实就是对于异常的一个整理,将checked exception 看做unchecked exception, 不处理,直接扔掉。 减少了到处写catch的不便利性。比如在线程中,catch所有异常,再比如在一些不太可能发生异常的地方,但是你又必须cache checked exception的地方使用这个annotation会显得代码比较规整,易读

@UtilityClass

工具类

@Accessors(chain = true):使用链式创建:

@Setter @Getter @Accessors(chain = true) public class User {

   private String id;
   private String name;
   private Integer age;

}

public static void main(String[] args) {

   //使用@Accessors(chain = true)
   User userChain = new User();
   userChain.setId("1").setName("chain").setAge(1);

}


@Builder

使用builder模式创建对象

@Setter
@Getter
@Builder
public class User {
    private String id;
    private String name;
    private Integer age;
}

public static void main(String[] args) {
    User user = User.builder().id("1").name("builder").age(1).build();
    System.out.println(user.getId());
}

@CleanUp

清理流对象

@Cleanup
OutputStream outStream = new FileOutputStream(new File("text.txt"));
@Cleanup
InputStream inStream = new FileInputStream(new File("text2.txt"));
byte[] b = new byte[65536];
while (true) {
   int r = inStream.read(b);
   if (r == -1) break;
   outStream.write(b, 0, r); 
}