跳转至

笔记

Lombok @Builder 注解

可以更方便地给变量复制

Java
// Example.java
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ExecuteCodeRequest {

    private String code;

    private String language;
}

// 使用
Example example = Example.builder()
        .code()
        .language()
        .build();

参数配置化

可以通过 @Value 注解获取 application.yml 中的配置信息

application.yml 中配置:

YAML
1
2
3
codesandbox:
  type:
    example

通过 @Value 注解获取配置:

Java
@Value("${codesandbox.type}")
private String type;

工厂模式优化

使用工厂模式,根据用户传入的字符串参数,生成对应代码沙箱的实现类。

静态工厂模式:

Java
/**
 * 代码沙箱工厂(根据类型创建代码沙箱)
 *
 * @author: <a href="https://github.com/DopplerXD">doppleryxc</a>
 * @time: 2025/3/9 14:51
 */
public class CodeSandboxFactory {

    /**
     * 创建代码沙箱示例
     *
     * @param type 沙箱类型
     * @return
     */
    public static CodeSandbox newInstance(String type) {
        return switch (type) {
            case "example" -> new ExampleCodeSandbox();
            case "remote" -> new RemoteCodeSandbox();
            case "thirdParty" -> new ThirdPartyCodeSandbox();
            default -> new ExampleCodeSandbox();
        };
    }
}

进而可以根据字符串动态生成示例,提高通用性:

Java
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    while (scanner.hasNext()) {
        String type = scanner.next();
        CodeSandbox codeSandbox = CodeSandboxFactory.newInstance(type);
        String code = "int main() { }";
        String language = JudgeSubmitLanguage.JAVA.getValue();
        List<String> inputList = Arrays.asList("1 2", "3 4");
        ExecuteCodeRequest executeCodeRequest = ExecuteCodeRequest.builder()
                .code(code)
                .language(language)
                .inputList(inputList)
                .build();
        ExecuteCodeResponse executeCodeResponse = codeSandbox.executeCode(executeCodeRequest);
    }
}

代理类配合 @Slf4j 注解来更方便地生成日志

使用代理模式,提供一个 Proxy,来增强代码沙箱地能力,不需要在每个实现类都执行 log.info() 等操作。

代理类 CodeSandboxProxy

Java
/**
 * 代码沙箱代理类
 *
 * @author: <a href="https://github.com/DopplerXD">doppleryxc</a>
 * @time: 2025/3/9 15:08
 */
@Slf4j
public class CodeSandboxProxy implements CodeSandbox {

    private final CodeSandbox codeSandbox;

    public CodeSandboxProxy(CodeSandbox codeSandbox) {
        this.codeSandbox = codeSandbox;
    }

    @Override
    public ExecuteCodeResponse executeCode(ExecuteCodeRequest request) {
        log.info("代码沙箱请求信息:" + request.toString());
        ExecuteCodeResponse response = codeSandbox.executeCode(request);
        log.info("代码沙箱响应信息:" + response.toString());
        return response;
    }
}

使用:

Java
CodeSandbox codeSandbox = CodeSandboxFactory.newInstance(type);
codeSandbox = new CodeSandboxProxy(codeSandbox);