创建类时验证数据类型

问题描述 投票:0回答:1

有以下代码:

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类型的合规性?

java validation instanceof
1个回答
0
投票

您的目标是在单独的方法中根据设置全局类型验证设置本地类型。由于当您要执行检查时,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();
}

}

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.