什么规范支持可选参数?
当前回答
简短版本:
用三个点:
public void foo(Object... x) {
String first = x.length > 0 ? (String)x[0] : "Hello";
int duration = x.length > 1 ? Integer.parseInt((String) x[1]) : 888;
}
foo("Hii", );
foo("Hii", 146);
(根据@VitaliiFedorenko的回答)
其他回答
如果您计划使用具有多个参数的接口, 可以使用以下结构模式,并根据您的需求实现或重写apply方法。
public abstract class Invoker<T> {
public T apply() {
return apply(null);
}
public abstract T apply(Object... params);
}
Java中没有可选参数。你能做的就是重载函数,然后传递默认值。
void SomeMethod(int age, String name) {
//
}
// Overload
void SomeMethod(int age) {
SomeMethod(age, "John Doe");
}
您可以使用类似于构建器的类来包含可选值,如下所示。
public class Options {
private String someString = "default value";
private int someInt= 0;
public Options setSomeString(String someString) {
this.someString = someString;
return this;
}
public Options setSomeInt(int someInt) {
this.someInt = someInt;
return this;
}
}
public static void foo(Consumer<Options> consumer) {
Options options = new Options();
consumer.accept(options);
System.out.println("someString = " + options.someString + ", someInt = " + options.someInt);
}
使用像
foo(o -> o.setSomeString("something").setSomeInt(5));
输出是
someString = something, someInt = 5
要跳过所有可选值,你必须像foo(o ->{})那样调用它;或者,如果您愿意,可以创建第二个foo()方法,该方法不接受可选参数。
使用这种方法,您可以以任何顺序指定可选值,而不会产生任何歧义。与varargs不同,你也可以有不同类的参数。如果可以使用注释和代码生成来创建Options类,这种方法就更好了。
变量函数可以(以某种方式)做到这一点。除此之外,必须提供方法声明中的所有变量。如果希望变量是可选的,可以使用不需要参数的签名重载方法。
private boolean defaultOptionalFlagValue = true;
public void doSomething(boolean optionalFlag) {
...
}
public void doSomething() {
doSomething(defaultOptionalFlagValue);
}
这是一个老问题,甚至在实际的可选类型引入之前,但现在你可以考虑以下几件事: -使用方法重载 - use可选类型,优点是避免传递空值 可选类型是在Java 8中引入的,通常是在第三方lib(如谷歌的Guava)中使用。使用optional作为参数/参数可能被认为是过度使用,因为主要目的是将其用作返回时间。
裁判:https://itcodehub.blogspot.com/2019/06/using-optional-type-in-java.html
推荐文章
- 指定的子节点已经有一个父节点。你必须先在子对象的父对象上调用removeView() (Android)
- 对于一个布尔字段,它的getter/setter的命名约定是什么?
- 如何获得当前屏幕方向?
- 如何在Android中渲染PDF文件
- 如何计算一个元素在列表中出现的次数
- c++中类似于java的instanceof
- 我如何解决错误“minCompileSdk(31)指定在一个依赖的AAR元数据”在本机Java或Kotlin?
- 如何POST表单数据与Spring RestTemplate?
- Mockito中检测到未完成的存根
- 我应该如何复制字符串在Java?
- “while(true)”循环有那么糟糕吗?
- 这个方法签名中的省略号(…)是干什么用的?
- Java:如何测试调用System.exit()的方法?
- 带有返回类型的Java方法在没有返回语句的情况下编译
- Java“此语言级别不支持lambda表达式”