开发中你不知道的技巧

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中.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值