Java参数绑定案例如何优化

wen java案例 31

本文目录导读:

Java参数绑定案例如何优化

  1. 基础优化:使用封装对象
  2. Builder模式优化
  3. Spring MVC Controller优化
  4. 复杂查询参数优化
  5. 复杂业务参数优化
  6. 性能优化:使用缓存

我来分享几个Java参数绑定的优化案例,从简单到复杂,涵盖常见的场景。

基础优化:使用封装对象

❌ 不好的做法

public void createUser(String username, String password, 
                      String email, String phone, 
                      String address, String city) {
    // 方法实现
}

✅ 优化后

public class CreateUserRequest {
    @NotBlank(message = "用户名不能为空")
    private String username;
    @Size(min = 6, message = "密码至少6位")
    private String password;
    @Email(message = "邮箱格式不正确")
    private String email;
    private String phone;
    private String address;
    private String city;
    // getter/setter
}
public void createUser(CreateUserRequest request) {
    // 方法实现
}

Builder模式优化

❌ 多个可选参数

public class SearchCriteria {
    private String keyword;
    private Integer categoryId;
    private Double minPrice;
    private Double maxPrice;
    private String sortBy;
    private Boolean ascending;
    private Integer pageNum;
    private Integer pageSize;
    public SearchCriteria(String keyword, Integer categoryId, 
                         Double minPrice, Double maxPrice,
                         String sortBy, Boolean ascending,
                         Integer pageNum, Integer pageSize) {
        // 太多参数的构造函数
    }
}

✅ 使用Builder模式

public class SearchCriteria {
    private String keyword;
    private Integer categoryId;
    private Double minPrice;
    private Double maxPrice;
    private String sortBy;
    private Boolean ascending = true; // 默认值
    private Integer pageNum = 1;
    private Integer pageSize = 20;
    private SearchCriteria(Builder builder) {
        this.keyword = builder.keyword;
        this.categoryId = builder.categoryId;
        this.minPrice = builder.minPrice;
        this.maxPrice = builder.maxPrice;
        this.sortBy = builder.sortBy;
        this.ascending = builder.ascending;
        this.pageNum = builder.pageNum;
        this.pageSize = builder.pageSize;
    }
    public static class Builder {
        // 必需参数
        private String keyword;
        // 可选参数
        private Integer categoryId;
        private Double minPrice;
        private Double maxPrice;
        private String sortBy;
        private Boolean ascending = true;
        private Integer pageNum = 1;
        private Integer pageSize = 20;
        public Builder(String keyword) {
            this.keyword = keyword;
        }
        public Builder categoryId(Integer categoryId) {
            this.categoryId = categoryId;
            return this;
        }
        public Builder priceRange(Double min, Double max) {
            this.minPrice = min;
            this.maxPrice = max;
            return this;
        }
        public Builder sort(String sortBy, Boolean ascending) {
            this.sortBy = sortBy;
            this.ascending = ascending;
            return this;
        }
        public Builder page(int pageNum, int pageSize) {
            this.pageNum = pageNum;
            this.pageSize = pageSize;
            return this;
        }
        public SearchCriteria build() {
            return new SearchCriteria(this);
        }
    }
    // getter方法
}
// 使用示例
SearchCriteria criteria = new SearchCriteria.Builder("手机")
    .categoryId(1)
    .priceRange(1000.0, 5000.0)
    .sort("price", false)
    .page(1, 20)
    .build();

Spring MVC Controller优化

❌ 参数过多

@PostMapping("/order")
public Result createOrder(@RequestParam Long userId,
                         @RequestParam Long productId,
                         @RequestParam Integer quantity,
                         @RequestParam(required = false) String couponCode,
                         @RequestParam(required = false) String remark,
                         @RequestParam(required = false) Long addressId,
                         @RequestParam(required = false) String paymentMethod) {
    // 实现
}

✅ 使用DTO + 校验

@Data
public class CreateOrderRequest {
    @NotNull(message = "用户ID不能为空")
    private Long userId;
    @NotNull(message = "商品ID不能为空")
    private Long productId;
    @Min(value = 1, message = "数量至少为1")
    @Max(value = 99, message = "数量不能超过99")
    private Integer quantity;
    private String couponCode;
    private String remark;
    @NotNull(message = "地址不能为空")
    private Long addressId;
    @Pattern(regexp = "(wechat|alipay|card)", message = "不支持的支付方式")
    private String paymentMethod;
}
@RestController
@RequestMapping("/api/orders")
@Validated
public class OrderController {
    @PostMapping
    public Result createOrder(@Valid @RequestBody CreateOrderRequest request) {
        // 直接使用request对象
        return orderService.createOrder(request);
    }
}

复杂查询参数优化

使用分组校验

@Data
public class ProductQueryRequest {
    public interface SimpleQuery {}
    public interface AdvancedQuery {}
    @NotNull(groups = {SimpleQuery.class, AdvancedQuery.class})
    private Long categoryId;
    @NotBlank(groups = SimpleQuery.class)
    private String keyword;
    @Min(value = 0, groups = AdvancedQuery.class)
    private Double minPrice;
    @Max(value = 100000, groups = AdvancedQuery.class)
    private Double maxPrice;
    @Pattern(regexp = "(price|sales|rating)", groups = AdvancedQuery.class)
    private String sortBy;
    private Integer page = 1;
    private Integer size = 20;
}
// 控制器使用
@GetMapping("/products")
public Result listProducts(
        @Validated(ProductQueryRequest.SimpleQuery.class) 
        ProductQueryRequest request) {
    return productService.listProducts(request);
}
@GetMapping("/products/advanced")
public Result advancedSearch(
        @Validated(ProductQueryRequest.AdvancedQuery.class) 
        ProductQueryRequest request) {
    return productService.advancedSearch(request);
}

复杂业务参数优化

使用策略模式

// 定义参数处理策略
public interface ParamHandler<T> {
    void handle(T param);
    boolean support(T param);
}
@Component
public class OrderParamHandler implements ParamHandler<CreateOrderRequest> {
    @Override
    public boolean support(CreateOrderRequest param) {
        return param.getPaymentMethod() != null;
    }
    @Override
    public void handle(CreateOrderRequest param) {
        // 订单相关参数处理
        validateStock(param.getProductId(), param.getQuantity());
        validateCoupon(param.getCouponCode());
    }
    private void validateStock(Long productId, Integer quantity) {
        // 验证库存
    }
    private void validateCoupon(String couponCode) {
        // 验证优惠券
    }
}
// 统一参数处理
@Component
public class ParamHandlerChain {
    @Autowired
    private List<ParamHandler> handlers;
    public <T> void process(T param) {
        handlers.stream()
                .filter(handler -> handler.support(param))
                .forEach(handler -> handler.handle(param));
    }
}
// 控制器中使用
@PostMapping("/orders")
public Result createOrder(@Valid @RequestBody CreateOrderRequest request) {
    paramHandlerChain.process(request);
    return orderService.createOrder(request);
}

性能优化:使用缓存

@Component
public class ParamValidator {
    private final Cache<String, Boolean> validationCache;
    public ParamValidator() {
        this.validationCache = Caffeine.newBuilder()
                .maximumSize(10000)
                .expireAfterWrite(10, TimeUnit.MINUTES)
                .build();
    }
    public boolean validate(Object param) {
        String cacheKey = generateCacheKey(param);
        return validationCache.get(cacheKey, key -> {
            // 实际的校验逻辑
            return doValidate(param);
        });
    }
    private String generateCacheKey(Object param) {
        // 生成缓存key
        return param.getClass().getSimpleName() + ":" + 
               param.hashCode();
    }
    private boolean doValidate(Object param) {
        // 执行校验
        return true;
    }
}

优化Java参数绑定的关键点:

  1. 使用DTO对象:减少方法参数数量
  2. Builder模式:处理多个可选参数
  3. 参数校验:使用Bean Validation注解
  4. 分组校验:根据不同场景区分校验规则
  5. 策略模式:处理复杂业务逻辑
  6. 缓存优化:对频繁校验的参数使用缓存

这样可以让代码更清晰、更易维护,同时提高性能。

抱歉,评论功能暂时关闭!