是否可以重新初始化 class 中的静态可变字段?
Is it possible to reinitialize static mutable fields in a class?
我正在尝试对旨在解决竞争性编程挑战的自定义编写的程序进行自动化测试。下面是解决方案的虚拟示例实现:
public class Solution {
private static String dummyField = "initial";
public static int initialize(InputStream in) {
//competitive programmer custom code
System.out.println(dummyField);
dummyField = "changed";
return subCaseCount;
}
public void processSingleSubCase(InputStream in) {
//competitive programmer custom code
}
}
解决方案的预写测试代码,无论其实现如何:
public void testSolution() throws FileNotFoundException {
for(File testResource : testResources) {
InputStream in = new FileInputStream(testResource);
int subCaseCount = Foo.initialize(in);
for (int subCase = 0; subCase < subCaseCount; subCase++) {
new Foo().processSingleSubCase(in);
}
//magic call to re-init all static fields without knowing their number/names in advance goes here
}
//console current output:
//initial
//changed
//changed
//...
//desired:
//initial
//initial
//initial
//....
}
静态字段可以是可变的,因此缓存初始值并使用反射将它们映射到字段名称作为第一个设置,然后在迭代之间重新分配它们是行不通的。
我确实想出了一个可行的解决方案,基本上是在迭代之间使用不同的 class 加载程序重新加载 class,它确实有效但速度很慢:大约需要 50 秒 只是为了重新加载 classes 300 次(测试资源是自动生成的,我希望能够灵活地自动生成尽可能多的内容)。
有没有更快的选择?
我关于如何做到这一点的两个想法是:
使用实例而不是 static
s,因为这样每个测试的新实例都是新鲜的。
如果您需要(或想要)坚持使用 static
s:在第一次测试之前,缓存 static
值,然后在测试之间从缓存中重新分配它们.如果 static
值是引用可变对象的对象引用,则需要进行深度复制。
我正在尝试对旨在解决竞争性编程挑战的自定义编写的程序进行自动化测试。下面是解决方案的虚拟示例实现:
public class Solution {
private static String dummyField = "initial";
public static int initialize(InputStream in) {
//competitive programmer custom code
System.out.println(dummyField);
dummyField = "changed";
return subCaseCount;
}
public void processSingleSubCase(InputStream in) {
//competitive programmer custom code
}
}
解决方案的预写测试代码,无论其实现如何:
public void testSolution() throws FileNotFoundException {
for(File testResource : testResources) {
InputStream in = new FileInputStream(testResource);
int subCaseCount = Foo.initialize(in);
for (int subCase = 0; subCase < subCaseCount; subCase++) {
new Foo().processSingleSubCase(in);
}
//magic call to re-init all static fields without knowing their number/names in advance goes here
}
//console current output:
//initial
//changed
//changed
//...
//desired:
//initial
//initial
//initial
//....
}
静态字段可以是可变的,因此缓存初始值并使用反射将它们映射到字段名称作为第一个设置,然后在迭代之间重新分配它们是行不通的。
我确实想出了一个可行的解决方案,基本上是在迭代之间使用不同的 class 加载程序重新加载 class,它确实有效但速度很慢:大约需要 50 秒 只是为了重新加载 classes 300 次(测试资源是自动生成的,我希望能够灵活地自动生成尽可能多的内容)。
有没有更快的选择?
我关于如何做到这一点的两个想法是:
使用实例而不是
static
s,因为这样每个测试的新实例都是新鲜的。如果您需要(或想要)坚持使用
static
s:在第一次测试之前,缓存static
值,然后在测试之间从缓存中重新分配它们.如果static
值是引用可变对象的对象引用,则需要进行深度复制。