什么规范支持可选参数?
当前回答
如果它是一个API端点,一种优雅的方法是使用“Spring”注释:
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam(required = false, defaultValue = "hello") String id) {
return innerFunc(id);
}
注意在这个例子中,innerFunc将需要这个变量,因为它不是api端点,不能使用这个Spring注释使它成为可选的。 参考:https://www.baeldung.com/spring-request-param
其他回答
你可以像这样使用方法重载。
public void load(String name){ }
public void load(String name,int age){}
你也可以使用@Nullable注释
public void load(@Nullable String name,int age){}
简单地传递null作为第一个参数。
如果你传递相同类型的变量,你可以使用这个
public void load(String name...){}
您可以使用类似于构建器的类来包含可选值,如下所示。
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类,这种方法就更好了。
VarArgs和重载已经被提到。另一种选择是Bloch Builder模式,它看起来像这样:
MyObject my = new MyObjectBuilder().setParam1(value)
.setParam3(otherValue)
.setParam6(thirdValue)
.build();
尽管这种模式最适合于在构造函数中需要可选参数的情况。
Java 5.0中有可选参数。只需像这样声明你的函数:
public void doSomething(boolean... optionalFlag) {
//default to "false"
//boolean flag = (optionalFlag.length >= 1) ? optionalFlag[0] : false;
}
你可以调用doSomething();或doSomething(真正的);现在。
你可以这样使用:
public void addError(String path, String key, Object... params) {
}
params变量是可选的。它被视为对象的可空数组。
奇怪的是,我在文档中找不到任何关于这个的东西,但它是有效的!
这是Java 1.5及以上版本的“新功能”(Java 1.4或更早版本不支持)。
我看到用户bhoot在下面也提到了这一点。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap