笔记
约 418 字大约 1 分钟
2025-03-13
Lombok @Builder 注解
可以更方便地给变量复制
// 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
中配置:
codesandbox:
type:
example
通过 @Value
注解获取配置:
@Value("${codesandbox.type}")
private String type;
工厂模式优化
使用工厂模式,根据用户传入的字符串参数,生成对应代码沙箱的实现类。
静态工厂模式:
/**
* 代码沙箱工厂(根据类型创建代码沙箱)
*
* @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();
};
}
}
进而可以根据字符串动态生成示例,提高通用性:
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
:
/**
* 代码沙箱代理类
*
* @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;
}
}
使用:
CodeSandbox codeSandbox = CodeSandboxFactory.newInstance(type);
codeSandbox = new CodeSandboxProxy(codeSandbox);