Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可选的可以用作捕获ConversionException的替代方法吗_Java_Monads_Optional - Fatal编程技术网

Java 可选的可以用作捕获ConversionException的替代方法吗

Java 可选的可以用作捕获ConversionException的替代方法吗,java,monads,optional,Java,Monads,Optional,如何重构以下读取属性文件的代码,使其根据读取值返回int、double或String public static <T> T readFromConfig(String keyName) { PropertiesConfiguration config = new PropertiesConfiguration(); String propertiesFilePath = "src/main/resources/application.properties";

如何重构以下读取属性文件的代码,使其根据读取值返回int、double或String

    public static <T> T readFromConfig(String keyName) {
    PropertiesConfiguration config = new PropertiesConfiguration();
    String propertiesFilePath = "src/main/resources/application.properties";
    try {
        config.load(propertiesFilePath);
        try {
            Integer value = config.getInt(keyName);
            return (T) value;
        } catch (ConversionException notInteger) {
            try {
                Double value = config.getDouble(keyName);
                return (T) value;
            } catch (ConversionException notDouble) {
                return (T) config.getString(keyName);
            }
        }
    } catch (ConfigurationException e) {
        logger.warn("Could not parse " + propertiesFilePath);
        return (T) "";
    }
}
publicstatict readFromConfig(字符串keyName){
PropertiesConfiguration配置=新建PropertiesConfiguration();
String propertiesFilePath=“src/main/resources/application.properties”;
试一试{
load(propertiesFilePath);
试一试{
整数值=config.getInt(keyName);
返回(T)值;
}捕获(ConversionException notInteger){
试一试{
Double value=config.getDouble(keyName);
返回(T)值;
}捕获(转换异常非双精度){
return(T)config.getString(keyName);
}
}
}捕获(配置异常e){
logger.warn(“无法解析”+属性文件路径);
返回(T)“;
}
}

所以,这就是脱险的结束。
问题“可选是否可以用作捕获ConversionException的替代方案?”的答案是

,因此,这就是解除冲突的结束。
问题“可选是否可以用作捕获ConversionException的替代方案?”的答案是

以下是我可以建议您的,这也明显违反了单一责任原则(SRP),因为它试图转换为三种不同的类型,对于更干净的代码应该避免:

public static Optional<Object> readFromConfig(String keyName) {
    PropertiesConfiguration config = new PropertiesConfiguration();
    String propertiesFilePath = "src/main/resources/opf.properties";
    try {
        config.load(propertiesFilePath);

        return Stream.<Supplier<Optional>>of(
                () -> Optional.of(config.getInt(keyName)),
                () -> Optional.of(config.getDouble(keyName)),
                () -> Optional.of(config.getString(keyName)))
                .map(Supplier::get)
                .filter(Optional::isPresent)
                .map(Optional::get)
                .findFirst();

    } catch (Exception e) {
        return Optional.empty();
    }
}
public静态可选readFromConfig(字符串keyName){
PropertiesConfiguration配置=新建PropertiesConfiguration();
字符串propertiesFilePath=“src/main/resources/opf.properties”;
试一试{
load(propertiesFilePath);
回流(
()->可选的.of(config.getInt(keyName)),
()->可选的.of(config.getDouble(keyName)),
()->可选的.of(config.getString(keyName)))
.map(供应商::获取)
.filter(可选::isPresent)
.map(可选::get)
.findFirst();
}捕获(例外e){
返回可选的.empty();
}
}

以下是我可以向您建议的,这显然违反了单一责任原则(SRP),因为它试图转换为三种不同的类型,对于更干净的代码应该避免:

public static Optional<Object> readFromConfig(String keyName) {
    PropertiesConfiguration config = new PropertiesConfiguration();
    String propertiesFilePath = "src/main/resources/opf.properties";
    try {
        config.load(propertiesFilePath);

        return Stream.<Supplier<Optional>>of(
                () -> Optional.of(config.getInt(keyName)),
                () -> Optional.of(config.getDouble(keyName)),
                () -> Optional.of(config.getString(keyName)))
                .map(Supplier::get)
                .filter(Optional::isPresent)
                .map(Optional::get)
                .findFirst();

    } catch (Exception e) {
        return Optional.empty();
    }
}
public静态可选readFromConfig(字符串keyName){
PropertiesConfiguration配置=新建PropertiesConfiguration();
字符串propertiesFilePath=“src/main/resources/opf.properties”;
试一试{
load(propertiesFilePath);
回流(
()->可选的.of(config.getInt(keyName)),
()->可选的.of(config.getDouble(keyName)),
()->可选的.of(config.getString(keyName)))
.map(供应商::获取)
.filter(可选::isPresent)
.map(可选::get)
.findFirst();
}捕获(例外e){
返回可选的.empty();
}
}

正如作者自己所想:
可选
在这里不是一个选项,因为,正如另一个答案所示:它将导致返回
可选
,从而提供更少的类型信息

但老实说,从干净的代码角度来看,即使

public static <T> T readFromConfig(String keyName) {
编译器不会抱怨的。因为它看到:你想要一个整数;嘿,这个方法可以返回一个整数

在运行时?当检索到的值不是整数时,将返回一个Double或字符串。不知道这里会发生什么(类强制转换异常,或者某些堆栈冲突)。但它不应该在运行时工作

因此,real解决方案如下:

您可以使用多种方法,例如:

public static Integer readIntegerFromConfig(String keyName) throws SomeException ...
public static Integer readIntegerFromConfig(String keyName, Integer Default) throws SomeException ...
或者可能:

public static Object readFromConfig(String keyName) {

public static T readFromConfig(字符串keyName,T默认值)
换句话说:你需要一个API,它允许it用户真正说出他们想要的,并且总是给他们想要的。或者完全避免在该级别使用不同的类型,返回字符串,并让客户机代码进行转换


您当前的方法,如前所述:不给您带来任何好处,代价是一个误导性的、复杂的API。

正如作者自己所想:
Optional
在这里不是一个选项,因为,正如另一个答案所示:它将导致返回
Optional
,从而提供更少的类型信息

但老实说,从干净的代码角度来看,即使

public static <T> T readFromConfig(String keyName) {
编译器不会抱怨的。因为它看到:你想要一个整数;嘿,这个方法可以返回一个整数

在运行时?当检索到的值不是整数时,将返回一个Double或字符串。不知道这里会发生什么(类强制转换异常,或者某些堆栈冲突)。但它不应该在运行时工作

因此,real解决方案如下:

您可以使用多种方法,例如:

public static Integer readIntegerFromConfig(String keyName) throws SomeException ...
public static Integer readIntegerFromConfig(String keyName, Integer Default) throws SomeException ...
或者可能:

public static Object readFromConfig(String keyName) {

public static T readFromConfig(字符串keyName,T默认值)
换句话说:你需要一个API,它允许it用户真正说出他们想要的,并且总是给他们想要的。或者完全避免在该级别使用不同的类型,返回字符串,并让客户机代码进行转换


您当前的方法,如前所述:不给您带来任何好处,代价是一个误导性的、复杂的API。

我不知道如何在这里使用
可选的
来优化代码。如果您不知道属性中给出了哪种数据类型,那么您必须尝试不同的转换。我认为代码很容易理解,并且没有看到优化的最终需要。好吧,那么Optional只能捕获NPE,对吗?是的,
Optional
用于防止返回
null
。但是可以减少空检查和/或NPE。请注意,使用PropertiesConfiguration也有点奇怪。你