干掉了 else if
日志也完美打印: 入 出 异常 ctry catch finally的完美控制;
private JSONObject execute(TaobaoRequest request){
long start = System.currentTimeMillis();
TaobaoClient client = new DefaultTaobaoClient("https://eco.taobao.com/router/rest", "33165811", "1fc4f881bc52bc2ce0d90ee97f4b206d");
TaobaoResponse response = null;
try {
log.info("银泰接口调用request:{}", JSON.toJSONString(request));
response = client.execute(request);
JSONObject body = JSONObject.parseObject(response.getBody());
JSONObject errorResponse = body.getJSONObject("error_response");
if(errorResponse != null){
DingTalkUtils.alarmException("银泰接口调用异常, errorResponse=" + JSON.toJSONString(errorResponse));
return new JSONObject();
}
if (request instanceof AlibabaMosOpenmemberIntimeScDeviceRegisterRequest){
return body.getJSONObject("alibaba_mos_openmember_intime_sc_device_register_response").getJSONObject("result");
}
if (request instanceof AlibabaMosOpenmemberIntimeScUserAuthorizeRequest){
return body.getJSONObject("alibaba_mos_openmember_intime_sc_user_authorize_response").getJSONObject("result");
}
if (request instanceof AlibabaMosOpenmemberIntimeScUserGetRequest){
return body.getJSONObject("alibaba_mos_openmember_intime_sc_user_get_response").getJSONObject("result");
}
if (request instanceof AlibabaMosOpenmemberIntimeScThirdOrdersNotifyRequest){
return body.getJSONObject("alibaba_mos_openmember_intime_sc_third_orders_notify_response").getJSONObject("result");
}
return new JSONObject();
} catch (ApiException e) {
log.error("银泰接口调用异常,e:{}", e.getMessage(), e);
DingTalkUtils.alarmException("银泰接口调用异常,e:" + e.getMessage() + ", request=" + JSON.toJSONString(request));
return new JSONObject();
} finally {
log.info("银泰接口调用结果response:{}, 耗时:{}ms", JSON.toJSONString(response), System.currentTimeMillis() - start);
}
}
迭代然后更新JSONArray
@GetMapping("/update-refund-status")
@ApiResponse
@Operation(summary = "用户钱包 交易明细 插入")
public Boolean updateRefundStatus(String allOrderNo,String refundOrderNo,String userId,String currency,String status) {
val one = userWalletLogService.lambdaQuery().eq(CdbUserWalletLog::getUserId, userId).eq(CdbUserWalletLog::getCountry, currency)
.eq(CdbUserWalletLog::getOrderId,allOrderNo).one();
if (one == null) {
DingTalkUtils.alarmException(StrUtil.format("用户中心更新退款交易明细,找不到单子allOrderNo:{} refundOrderNo:{} userId:{} currency{}",allOrderNo,refundOrderNo,userId,currency));
return false;
}
final JSONArray more = JSONArray.parseArray(one.getMore());
for (Object o : more) {
JSONObject item = (JSONObject)o;
if (refundOrderNo.equals(item.getString("refundOrderNo"))) {
item.fluentPut("status",status);
break;
}
}
return userWalletLogService.lambdaUpdate().set(CdbUserWalletLog::getMore,more.toJSONString()).eq(CdbUserWalletLog::getUserId, userId).eq(CdbUserWalletLog::getCountry, currency)
.eq(CdbUserWalletLog::getOrderId,allOrderNo).update();
}
修改值 , 集合等容器很可能不变
package com.attack.doit;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import java.math.BigDecimal;
import static java.math.BigDecimal.ZERO;
public class Test {
public static void main(String[] args) {
JSONObject res = new JSONObject();
String a = "12";
BigDecimal couponUse = ZERO;
int yueUse = 0;
res.put("coupon", couponUse);
res.put("yue", yueUse);
res.put("notice", a);
Man man = new Man();
man.setName("one");
res.put("man", man);
System.out.println(JSON.toJSONString(res));
couponUse = couponUse.add(new BigDecimal("10"));
a = a + "2";
yueUse = yueUse + 1;
man.setName("two");
System.out.println(JSON.toJSONString(res));
System.out.println(couponUse);
}
@Data
public static class Man{
private String name;
}
}
不可变对象导致的
在Java中,不可变对象(Immutable Objects)是指一旦创建后,其状态就无法改变的对象。使用不可变对象可以提高代码的安全性、简化并发编程,并避免许多潜在的错误。以下是Java中常见的不可变对象:
String
String是 Java 中最常见的不可变对象。一旦创建,字符串的值不能改变。任何修改操作(如拼接、替换)都会生成一个新的String对象。
Wrapper Classes for Primitives
- Java 提供的基本数据类型的包装类,如
Integer、Long、Float、Double、Boolean、Character、Byte和Short,都是不可变的。这些包装类的对象一旦创建,其值就不能更改。
BigDecimal
BigDecimal是用于处理精确计算的不可变类。所有的数学运算方法(如add()、subtract()、multiply())都会返回一个新的BigDecimal对象,而不是修改原有对象。
BigInteger
BigInteger类用于表示任意精度的整数,也是不可变的。类似于BigDecimal,所有的运算方法都返回一个新的BigInteger对象。
LocalDate, LocalTime, LocalDateTime, ZonedDateTime*
- Java 8 引入的日期和时间API(
java.time包中的类)都是不可变的。比如LocalDate、LocalTime、LocalDateTime和ZonedDateTime,它们的状态在创建后无法修改。
UUID
UUID(Universally Unique Identifier,全局唯一标识符)类也是不可变的。生成一个UUID后,其值不可更改。
Optionals
Optional类是用于表示可能包含或不包含值的容器类。Optional对象本身是不可变的。
Enum
- 枚举类型 (
enum) 的实例是不可变的。在枚举类型中,所有可能的值在定义时就已经确定,无法在运行时更改。
Pattern
Pattern类用于定义正则表达式,它也是不可变的。编译一个正则表达式后,生成的Pattern对象不能修改。
Collections.unmodifiableXXX()
- 通过
Collections.unmodifiableList()、unmodifiableSet()、unmodifiableMap()创建的集合(如List、Set、Map)也是不可变的。一旦创建,这些集合的内容不能被修改。
自定义不可变对象
除了标准库中提供的不可变类,你也可以自己创建不可变对象。要实现一个不可变类,通常需要:
- 将类声明为
final,防止继承。 - 将所有字段声明为
private和final。 - 只提供 getter 方法,不提供 setter 方法。
- 在构造函数中进行深拷贝,防止外部修改传入的可变对象。
不可变对象在设计中广泛使用,有助于提升代码的稳定性和安全性,尤其是在多线程环境下。
| msg | project | 备注 |
|---|---|---|
| ignorePath.stream().anyMatch(url -> matcher.match(url, requestPath)) | crm-gateway-java | |
【1】一个boolean可以这样得到
傻逼,为什么不用 List.hashValue(Msg msg)
boolean canRun = TaskStatus.EXECUTION.getCode().equals(taskInfo.getStatus())
|| TaskStatus.WAIT_DISPATCH.getCode().equals(taskInfo.getStatus())
|| TaskStatus.RESERVE_EXECUTE.getCode().equals(taskInfo.getStatus())
|| WAIT_SERIAL_EXECUTE.getCode().equals(taskInfo.getStatus())
|| WAIT_NET_SWITCH.getCode().equals(taskInfo.getStatus())
|| WAIT_ONLINE.getCode().equals(taskInfo.getStatus());
【2】使用枚举的优雅
DjmsNetTpe netTpe = EnumUtils.parse(DjmsNetTpe.class, taskNetType);
int curDevNetTypeCode = curDevNetType == null ? -1 : curDevNetType.getCode();
switch (netTpe) {//netTpe是个枚举
case WIRED:
return NetType.NET_WIRED.getCode().equals(curDevNetTypeCode);
case WIFI:
case FIVE_G:
return (NetType.NET_WIRED.getCode().equals(curDevNetTypeCode) ||
NetType.NET_WIFI.getCode().equals(curDevNetTypeCode));
case THREE_FORE_G:
return (curDevNetTypeCode > 0);
default:
log.warn("unknown task netType:{}", taskNetType);
return false;
}
public enum DjmsNetTpe {
/**
* 执行任务时的网络要求
* */
WIRED(0, "有线"),
WIFI(1, "无线"),
THREE_FORE_G(2, "3G/4G"),
FIVE_G(3, "5G"),
;
private Integer code;
private String desc;
DjmsNetTpe(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public Integer getCode() {
return code;
}
【3】枚举再表现
switch (EnumUtils.parse(TaskStatus.class, taskInfo.getStatus())) {
case WAIT_DISPATCH:
case WAIT_ONLINE:
case WAIT_NET_SWITCH:
case WAIT_SERIAL_EXECUTE:
return taskInfo.getXxlJobId() != null && taskInfo.getXxlJobId() > 0;
default:
return false;
}
【4】return一个boolean的操作
可以是
List<Long> taskIds = taskService.getExclusiveRunningTaskIds(devId, TaskMode.EXCLUSIVE.getCode(), Lists.newArrayList(TaskStatus.EXECUTION.getCode()));
return !taskIds.isEmpty() && !taskIds.contains(taskInfo.getId());
可以是
return tiaojian? true:false;
显然,第一种是三目的变种,优雅的一批
【5】 使用Spring的Assert
Assert.notNull(taskInfo.getXxlJobId(), "jobId cant be null!");
Assert 判定 String 也是非常好用的啊,
【6】鉴定一个实体,不可为空,比拟Spring的Assert
public static <E extends Enum> Integer getCodeThrows(E e) {
Objects.requireNonNull(e, "EnumUtils' method getCode parameter `e` can't be null!");
本文探讨了在Java开发中实现代码优雅的各种技巧,包括利用枚举提高代码可读性,运用Spring框架的Assert工具进行参数校验,以及通过简洁的三目表达式返回布尔值等实用方法。
142

被折叠的 条评论
为什么被折叠?



