有以下代码:
public interface ISettings{
int value();
}
public record ExampleSet1 (int value) implements ISettings{}
public record ExampleSet2 (int value) implements ISettings{}
public class ExampleClass {
private final ExampleSet1 settingsGlobal;
public ExampleClass(ISettings settingsLocal) {
if (settingsLocal instanceof ExampleSet1 set) {
settingsGlobal = set;
} else {
throw new IllegalArgumentException("Settings type mismatch");
}
}
}
在构造函数中,需要检查settingsLocal是否对应settingsGlobal类型。我想将检查放在单独的方法中,但我无法获取 settingsGlobal 类型来检查其合规性。 有一个选项可以使用 getClass() 来实现验证:
public class ExampleClass {
private final ExampleSet1 settingsGlobal;
public ExampleClass(ISettings settingsLocal) {
if (!validateSettings(settingsLocal)) {
throw new IllegalArgumentException("Settings type mismatch");
}
settingsGlobal = (ExampleSet1) settingsLocal;
}
private boolean validateSettings(ISettings settingsLocal) {
return settingsLocal.getClass().equals(settingsGlobal.getClass());
}
}
但是我无法为未初始化的变量调用 getClass() 方法。
如何检查settingsGlobal类型的合规性?
您的目标是在单独的方法中根据设置全局类型验证设置本地类型。由于当您要执行检查时,settingsGlobal 尚未初始化,因此我们不能直接使用其 getClass() 方法。不过,我们仍然可以通过直接使用类类型来实现你想要的。解决办法如下:
public class ExampleClass {
private final ExampleSet1 settingsGlobal;
public ExampleClass(ISettings settingsLocal) {
if (!validateSettings(settingsLocal)) {
throw new IllegalArgumentException("Settings type mismatch");
}
settingsGlobal = (ExampleSet1) settingsLocal;
}
private boolean validateSettings(ISettings settingsLocal) {
return settingsLocal instanceof ExampleSet1;
}
}
如果您想让它更加灵活并允许ExampleClass使用不同类型的设置,您可以使用通用类型参数:
public class ExampleClass<T extends ISettings> {
private final T settingsGlobal;
public ExampleClass(ISettings settingsLocal) {
if (!validateSettings(settingsLocal)) {
throw new IllegalArgumentException("Settings type mismatch");
}
@SuppressWarnings("unchecked")
T castedSettings = (T) settingsLocal;
settingsGlobal = castedSettings;
}
private boolean validateSettings(ISettings settingsLocal) {
return settingsLocal.getClass() == ExampleClass.this.getClass().getTypeParameters()[0].getGenericDeclaration();
}
}