我读了一篇关于使用选项作为方法参数的文章,大家一致认为永远不要使用选项作为方法参数。
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;
}
}
首先,如果您使用的是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语言要求接口中的每种方法都必须由该接口的每种实现来实现。期。 这条规定没有例外。 说“收藏是一个例外”,这表明对这
我看到一段让我难以理解的代码,将其简化并放在这里: 模型类被定义为具有公共方法: 我的问题是: 对于