当前位置: 首页 > 知识库问答 >
问题:

Java可选的方法参数?

於乐语
2023-03-14

我读了一篇关于使用选项作为方法参数的文章,大家一致认为永远不要使用选项作为方法参数。

Guava可选作为可选参数的方法参数

这种使用optional作为方法参数的情况合法吗?如果不是,我如何使这是可列举的?

private static enum DbConnectionSupplier {
    ORACLE(optArg -> DbManager.getOracleConnection()),
    MYSQL(optArg -> DbManager.getMySQLConnection()),
    TERADATA(optArg -> DbManager.getTeradataConnection()),
    SQLITE(optArg -> DbManager.getSQLiteConnection(optArg.get()));

    private final Function<Optional<String>, DatabaseConnection> supplier;
    private DbConnectionSupplier(Function<Optional<String>, DatabaseConnection> supplier) { 
        this.supplier = supplier;
    }

}

共有1个答案

薛霄
2023-03-14

首先,如果您使用的是lambda表达式,那么您将使用Java8进行编译,并且可以使用Java.util.optional,而不是Guava的。

我想你有以下几种方法:

DatabaseConnection getConnection(String arg) {
   return supplier.apply(Optional.of(arg));
}

DatabaseConnection getConnection() {
   return supplier.apply(Optional.empty());
}

现在,它并不能保护您免受某人调用Teradata.getConnection(“bar”)的影响。另一方面,sqlite.getConnection()将在optarg.get()处以NosuchelementException(Java8)或IllegalStateException(Guava)失败,因为可选项为空。从这个例外情况来看,并不清楚GetConnection中是否需要一个参数(也许很清楚,但调用Function.Apply会“污染”stacktrace)

下面的实现避免了optional的使用,并提供了明确的指示,说明参数是应该的还是不应该的。

TERADATA(()-> DbManager.getTeradataConnection()),
SQLITE(arg -> DbManager.getSQLiteConnection(arg)),
FOO(()-> DbManager.getFooConnection(),
    arg->DbManager.getFooConnection(arg));
//Foo supports both styles: with and without a parameter

private final Supplier<DatabaseConnection> supplier;
private final Function<String, DatabaseConnection> function;

private DbConnectionSupplier(Supplier<DatabaseConnection> supplier) { 
    this.supplier = supplier;
    this.function = null;
}    

private DbConnectionSupplier(Function<String, DatabaseConnection> function) { 
    this.function = function;
    this.supplier = null;
}    `

private DbConnectionSupplier(
    Supplier<DatabaseConnection> supplier,
    Function<String, DatabaseConnection> function) { 
    this.function = function;
    this.supplier = supplier;
}    

public DatabaseConnection getConnection(String arg) {
   if (function==null) throw ...
   return function.apply(arg);
}

public DatabaseConnection getConnection() {
   if (supplier==null) throw ...
   return supplier.get();
}
 类似资料:
  • 问题内容: 最近,我与队友讨论了 在方法中使用可选参数的问题。 假设方法是 接受一个和 可选参数 ,它返回该目录中列出的书籍,如果还传递了类别,则仅返回该类别中的书籍。 冲突点是,验证是否为空检查。我认为不应对此进行空检查,因为它是可选参数。函数的调用者可以通过或,并且函数应在实现中处理两种情况。 我的意见是,对于可选参数,只会使方法的约定更加明确。只需查看方法签名即可知道此参数是可选的,不需要读

  • 最近,我和我的队友讨论了在方法中使用作为可选参数。 假设方法是 我的观点是,对于可选参数,只会使方法的契约更加清晰。只要看一下方法签名就可以知道这个参数是可选的,不需要读取JavaDocs。但当他不想使用该可选参数时,不应强制他传递。 我的队友有不同的看法。他希望对其进行空检查,从而强制调用方始终传递。他的观点是为什么我们要通过一个空的可选选项。此外,看起来比更易读。 这个方法在我们的一个库包中,

  • 在具体实际开发过程中,有时方法中参数的个数是不确定的。为了解决这个问题,在 J2SE 5.0 版本中引入了可变参数的概念。 声明可变参数的语法格式如下: 其中,methodName 表示方法名称;paramList 表示方法的固定参数列表;paramType 表示可变参数的类型;… 是声明可变参数的标识;paramName 表示可变参数名称。 注意:可变参数必须定义在参数列表的最后。 例 1 每次

  • 问题内容: 我想在存储库层中编写一些查询方法。此方法必须忽略空参数。例如: 在这种情况下,此方法必须返回Foo: 如果gooParam不为null。如果gooParam为null,则条件更改为: 有什么解决办法吗?有人能帮我吗? 问题答案: 来不及了。不确定 Bar 和 Goo 之间的关系。检查 Example是否 可以帮助您。 它为我工作。我有一个类似的情况,实体 用户 具有属性集,并且有基于属

  • 问题内容: 据我了解,如果您使用Java实现接口,则实现该接口的子类必须使用该接口中指定的方法。 我注意到在某些接口(例如Collection接口)中,有一些方法被注释为可选方法,但这究竟意味着什么?我觉得接口中指定的所有方法都需要吗? 问题答案: 这里的答案似乎有很多混乱。 Java语言要求接口中的每种方法都必须由该接口的每种实现来实现。期。 这条规定没有例外。 说“收藏是一个例外”,这表明对这

  • 我看到一段让我难以理解的代码,将其简化并放在这里: 模型类被定义为具有公共方法: 我的问题是: 对于