代码欣赏--

本文探讨了在Java开发中实现代码优雅的各种技巧,包括利用枚举提高代码可读性,运用Spring框架的Assert工具进行参数校验,以及通过简洁的三目表达式返回布尔值等实用方法。

干掉了 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 提供的基本数据类型的包装类,如 IntegerLongFloatDoubleBooleanCharacterByteShort,都是不可变的。这些包装类的对象一旦创建,其值就不能更改。

BigDecimal

  • BigDecimal 是用于处理精确计算的不可变类。所有的数学运算方法(如 add()subtract()multiply())都会返回一个新的 BigDecimal 对象,而不是修改原有对象。

BigInteger

  • BigInteger 类用于表示任意精度的整数,也是不可变的。类似于 BigDecimal,所有的运算方法都返回一个新的 BigInteger 对象。

LocalDate, LocalTime, LocalDateTime, ZonedDateTime*

  • Java 8 引入的日期和时间API(java.time 包中的类)都是不可变的。比如 LocalDateLocalTimeLocalDateTimeZonedDateTime,它们的状态在创建后无法修改。

UUID

  • UUID(Universally Unique Identifier,全局唯一标识符)类也是不可变的。生成一个 UUID 后,其值不可更改。

Optionals

  • Optional 类是用于表示可能包含或不包含值的容器类。Optional 对象本身是不可变的。

Enum

  • 枚举类型 (enum) 的实例是不可变的。在枚举类型中,所有可能的值在定义时就已经确定,无法在运行时更改。

Pattern

  • Pattern 类用于定义正则表达式,它也是不可变的。编译一个正则表达式后,生成的 Pattern 对象不能修改。

Collections.unmodifiableXXX()

  • 通过 Collections.unmodifiableList()unmodifiableSet()unmodifiableMap() 创建的集合(如 ListSetMap)也是不可变的。一旦创建,这些集合的内容不能被修改。

自定义不可变对象
除了标准库中提供的不可变类,你也可以自己创建不可变对象。要实现一个不可变类,通常需要:

  • 将类声明为 final,防止继承。
  • 将所有字段声明为 privatefinal
  • 只提供 getter 方法,不提供 setter 方法。
  • 在构造函数中进行深拷贝,防止外部修改传入的可变对象。

不可变对象在设计中广泛使用,有助于提升代码的稳定性和安全性,尤其是在多线程环境下。

msgproject备注
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!");
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值