You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过注解强制数组参数为9个整数?数独求解应用场景

当然可以实现!你想要的这种通过自定义注解来强制数组长度为9的需求,完全能做到,而且能帮你省去重复的length判断代码。下面给你两种实用的方案,根据你的项目场景选就行:

用注解强制数组参数长度为9的实现方案

方案一:利用Java Bean Validation(推荐)

Java的Bean Validation规范(现在是Jakarta Bean Validation,原javax.validation)本身就提供了参数校验能力,你可以自定义一个语义更清晰的@SizeNine注解,或者直接基于现有注解封装,让代码可读性拉满。

1. 自定义@SizeNine注解

先定义注解本身,指定它的生效范围和校验逻辑类:

import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;

@Documented
@Constraint(validatedBy = SizeNineValidator.class) // 指定校验器
@Target({ElementType.PARAMETER, ElementType.FIELD}) // 允许用在参数或字段上
@Retention(RetentionPolicy.RUNTIME) // 运行时生效
public @interface SizeNine {
    String message() default "数组长度必须为9(数独要求)"; // 校验失败提示
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

2. 实现对应的校验逻辑

编写注解的校验器,判断数组长度是否为9:

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

public class SizeNineValidator implements ConstraintValidator<SizeNine, int[]> {
    @Override
    public boolean isValid(int[] array, ConstraintValidatorContext context) {
        // 非空+长度为9才通过校验
        return array != null && array.length == 9;
    }
}

3. 在方法中使用并触发校验

如果是Spring项目,只要给类加上@Validated注解,参数上标注@SizeNine,Spring就会自动帮你做校验:

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Validated // 必须加这个注解触发参数校验
public class SudokuController {

    @PostMapping("/solve")
    public String solveSudoku(@SizeNine @RequestBody int[] sudokuGrid) {
        // 校验通过才会走到这里,直接处理数独求解逻辑就行
        return "数独求解完成!";
    }
}

如果是非Spring项目,可以手动调用校验器:

import jakarta.validation.Validation;
import jakarta.validation.Validator;
import jakarta.validation.ValidatorFactory;

public class SudokuSolver {
    private static final Validator validator;

    static {
        // 初始化校验器工厂
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        validator = factory.getValidator();
    }

    public void solve(@SizeNine int[] sudokuGrid) {
        // 手动执行校验
        var violations = validator.validate(sudokuGrid);
        if (!violations.isEmpty()) {
            throw new IllegalArgumentException(violations.iterator().next().getMessage());
        }
        // 业务逻辑:数独求解
    }
}

方案二:自定义AOP切面实现校验

如果你不想引入校验框架,也可以用AOP(面向切面编程)来拦截方法调用,手动校验带@SizeNine注解的参数。

1. 自定义@SizeNine注解(简化版)

import java.lang.annotation.*;

@Documented
@Target(ElementType.PARAMETER) // 只允许用在参数上
@Retention(RetentionPolicy.RUNTIME)
public @interface SizeNine {
}

2. 编写AOP切面拦截校验

用切面拦截所有方法调用,检查参数上的@SizeNine注解,判断数组长度:

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import java.lang.reflect.Parameter;

@Aspect
public class SizeNineValidationAspect {

    @Before("execution(* *(..))") // 拦截所有方法执行
    public void validateSizeNineParams(JoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Parameter[] parameters = signature.getMethod().getParameters();
        Object[] args = joinPoint.getArgs();

        // 遍历所有参数,检查是否有@SizeNine注解
        for (int i = 0; i < parameters.length; i++) {
            Parameter param = parameters[i];
            if (param.isAnnotationPresent(SizeNine.class) && args[i] instanceof int[] array) {
                if (array.length != 9) {
                    throw new IllegalArgumentException("参数数组长度必须为9,不符合数独要求");
                }
            }
        }
    }
}

把这个切面注册为Spring Bean(Spring项目),或者配置AspectJ织入(非Spring项目),就能自动生效了。

额外小建议

  • 如果你的项目已经在用Spring或其他支持Bean Validation的框架,优先选方案一,因为它是标准方案,还能复用很多现成的校验逻辑,比如非空校验、范围校验等。
  • 自定义@SizeNine比直接用@Size(min=9, max=9)的好处是语义更清晰,别人一看就知道这是给数独场景设计的,代码可读性更强。

内容的提问来源于stack exchange,提问作者Ömer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:09:09