开发中你不知道的技巧

  • Post author:
  • Post category:其他


1.代表”false”,Boolean.FALSE.toString()
2.查询数组中是否有一个name值一样,
boolean hasMethod = Arrays.stream(interfaceClass.getMethods()).anyMatch(method -> method.getName().equals(methodName));
3.spring初始化bean执行的方法
优先:通过实现 InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;
以下两个方法是通过反射执行,效率比直接调用方法慢些
通过 <bean> 元素的 init-method/destroy-method 属性指定初始化之后 /销毁之前调用的操作方法;
在指定方法上加上@PostConstruct 或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用。
spring bean的初始化执行顺序:构造方法 –> @PostConstruct注解的方法 –> afterPropertiesSet方法 –> init-method指定的方法。具体可以参考例子
4.

ApplicationListener

和ContextRefreshedEvent用于spring加载完所有的bean后调用的方法
applicationlistener可以监听多个接口,常用ApplicationListener<ApplicationReadyEvent>表示bean加载完毕事件
5.建立exception 继承RuntimeException
public class RpcException extends RuntimeException
6.打印错误日志
既打印了栈对列信息,也打印了异常名
log.error(“transfer queryDate range failed:{}”, ExceptionUtils.getStackTrace(e));
7、

封装方法时,当返回是一个空集合,尽量不要返回空对象,可以设置空集合

,可以使用java.util.

Collections

类中,
list:Collections.emptyList()
map:Collections.emptyMap()
8、新建map或者list对象时,尽量指定默认值大小,map为你要存的个数/0.75 +1 不知道默认传16
例如:

//initialCapacity = 15/0.75+1=21


Map


map =


new


HashMap(


21


);
9.解决跨域使用@

CrossOrigin注解
10.

【强制】

类名使用UpperCamelCase风格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID等。
正例:JavaServerlessPlatform / UserDO / XmlService / TcpUdpDeal / TaPromotion
反例:javaserverlessplatform / UserDo / XMLService / TCPUDPDeal / TAPromotion
11.

【强制】

POJO类中布尔类型变量都不要加is前缀,否则部分框架解析会引起序列化错误。
说明:在本文 MySQL 规约中的建表约定第一条,表达是与否的值采用 is_xxx 的命名方式,所以,需要在 <resultMap>设置从 is_xxx到 xxx的映射关系。
反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),RPC框架在反向解 析的时候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。
12.

【强制】

避免在子父类的成员变量之间、或者不同代码块的局部变量之间采用完全相同的命 名,使可读性降低。
说明:子类、父类成员变量名相同,即使是 public 类型的变量也是能够通过编译,而局部变量在同一方法 内的不同代码块中同名也是合法的,但是要避免使用。


对于非 setter/getter 的参数名称也要避免与成员 变量名称相同


。 反例: public class ConfusingName {     public int age;


// 非setter/getter 的参数名称,不允许与本类成员变量同名     public void getData(String alibaba)


{         if(condition) {             final int money = 531;             // …         }
for (int i = 0; i < 10; i++) {             // 在同一方法体中,不允许与其它代码块中的money命名相同             final int money = 615;             // …         }     } }
class Son extends ConfusingName {     // 不允许与父类的成员变量名称相同     public int age; }
13.:使用 java.util.

Objects

#

equals

(JDK7 引入的工具类)。
14.使用@Value注入静态字段:
//静态类里的字段
public static String[] filterDeviceIds;

@Value(“${filter.deviceIds}”)

public void setAppId(String[] ids) {


filterDeviceIds = ids;

}

注意:这里不能使用@postconstruct,因为静态类项目启动只会设置一次,但是如果修改配置中心不会实时刷新
dubbo服务暴露
服务暴露过程大致可分为三个部分:
前置工作,主要用于检查参数,组装 URL。
导出服务,包含暴露服务到本地 (JVM),和暴露服务到远程两个过程。
向注册中心注册服务,用于服务发现。
15、返回对象属性名称为大写,但是java命名为小写,可以使用fastjson


@JSONField(name = “PKID”)

private Integer pkId;
JSONObject result = restTemplate.getForEntity(fetchOrderInfoByIdUrl+orderId, JSONObject.class).getBody();

result.getObject(“Result”, OrderModel.class);
16.MessageFormat.format(“人群数量达到上限{0}个,建议删除不用的人群后再次创建”,12)
17.判空判断:
修改前:
if(dao!=null){
System.out.println(“1”)
}
修改后:
Optional.ofNullable(dao).ifPresent(dao1 -> System.out.println(“1”));
  1. new String(“1”)
字符串 指定编码utf-8 默认windows gbk linux utf-8
19.byte直接转对象
20.如果需要封装一个方法,某个值为空返回默认,不为空返回

public V getOrDefault(Object key, V defaultValue) {


V v;

return (v = get(key)) == null ? defaultValue : v;

}

21.核心统一对外接口返回响应格式最好加上编码(建议)
以下这种方式基本没啥问题,但是最好加上字符编码produces = “application/json;charset=UTF-8”

@PostMapping(“push”)



@PostMapping(value = “push”, produces = “application/json;charset=UTF-8”)



@Override

@ApiOperation(“消息推送接口”)

public BizResponse<PushResponse> push(@Valid @RequestBody PushRequest request) {


}

22.对象复制,大量数据是最好使用

mapstruct

,少量数据使用spring beanutil(反射效率较差)
23.if else原则:

  • if-else 不超过 2 层,块中代码 1~5 行,直接写到块中,否则封装为方法

  • if-else


    超过


    2


    层,但块中的代码不超过


    3


    行,尽量使用卫语句

if(obj != null){doSomething();}


转换成卫语句以后的代码如下:


if(obj == null){return;}

doSomething();


  • if-else


    超过


    2


    层,且块中代码超过


    3


    行,尽量使用策略模式
24.集合去重

protected final <T> List<T> removeDuplicates(List<T> list) {


return new ArrayList<>(new LinkedHashSet<>(list));

}

25、工厂类可以通过spring @Autowired注解直接注入不用写init方法
根据策略名称生产下单的具体策略
@Autowired
private Map<String, OrderCreateStrategy> strategyMap = new ConcurrentHashMap<>();
public OrderCreateStrategy getStrategy(String strategyName) {
OrderCreateStrategy strategy = strategyMap.get(strategyName);
return strategy;
}

定义方法getStrategy,传入策略的名称.
小技巧,这里可以看到方法内部是根据map去取的.其中map定义:
private Map<String, OrderCreateStrategy> strategyMap = new ConcurrentHashMap<>()
@Autowired 标注作用于 Map 类型时,如果 Map 的 key 为 String 类型,则 Spring 会将容器中所有类型符合 Map 的 value 对应的类型的 Bean 增加进来,用 Bean 的 id 或 name 作为 Map 的 key.
这里通过spring框架会把OrderCreateStrategy接口的所有的子类都放入map中.



版权声明:本文为mrb1289798400原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。