如何在 Java 中使用可选参数?
什么规格支持可选参数?
What specification supports optional parameters?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
什么规格支持可选参数?
What specification supports optional parameters?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(17)
Java 中有多种模拟可选参数的方法。
方法重载
这种方法的局限性之一是,如果您有两个相同类型的可选参数并且其中任何一个都可以省略,则该方法不起作用。
Varargs
a) 所有可选参数的类型相同:
b) 可选参数的类型可能不同:
这种方法的主要缺点是,如果可选参数的类型不同,则会丢失静态类型检查。 此外,如果每个参数具有不同的含义,您需要某种方法来区分它们。
现在
为了解决前面方法的局限性,您可以允许空值,然后分析方法体中的每个参数:
必须提供所有参数值,但默认值可能为空。
可选类
此方法与 null 类似,但对具有默认值的参数使用 Java 8 可选类:
Optional 使方法契约对于调用者来说是明确的,但是,人们可能会发现这样的签名过于冗长。
更新:Java 8 包含开箱即用的 java.util.Optional 类,因此在 Java 8 中无需为此特定原因使用 guava。方法名称有点不同尽管。
Builder 模式
Builder 模式用于构造函数,通过引入单独的 Builder 类来实现:
Maps
当参数数量过多并且通常使用大多数默认值时,可以将方法参数作为其名称的映射传递/values:
在 Java 9 中,这种方法变得更容易:
请注意,您可以组合这些方法中的任何一种来实现理想的结果。
There are several ways to simulate optional parameters in Java.
Method overloading
One of the limitations of this approach is that it doesn't work if you have two optional parameters of the same type and any of them can be omitted.
Varargs
a) All optional parameters are of the same type:
b) Types of optional parameters may be different:
The main drawback of this approach is that if optional parameters are of different types you lose static type checking. Furthermore, if each parameter has the different meaning you need some way to distinguish them.
Nulls
To address the limitations of the previous approaches you can allow null values and then analyze each parameter in a method body:
Now all arguments values must be provided, but the default ones may be null.
Optional class
This approach is similar to nulls, but uses Java 8 Optional class for parameters that have a default value:
Optional makes a method contract explicit for a caller, however, one may find such signature too verbose.
Update: Java 8 includes the class
java.util.Optional
out-of-the-box, so there is no need to use guava for this particular reason in Java 8. The method name is a bit different though.Builder pattern
The builder pattern is used for constructors and is implemented by introducing a separate Builder class:
Maps
When the number of parameters is too large and for most of the default values are usually used, you can pass method arguments as a map of their names/values:
In Java 9, this approach became easier:
Please note that you can combine any of these approaches to achieve a desirable result.
varargs 可以(在某种程度上)做到这一点。 除此之外,必须提供方法声明中的所有变量。 如果您希望变量是可选的,则可以使用不需要参数的签名来重载该方法。
varargs could do that (in a way). Other than that, all variables in the declaration of the method must be supplied. If you want a variable to be optional, you can overload the method using a signature which doesn't require the parameter.
Java 5.0 有可选参数。 只需像这样声明您的函数:
您现在可以使用
doSomething();
或doSomething(true);
进行调用。There is optional parameters with Java 5.0. Just declare your function like this:
you could call with
doSomething();
ordoSomething(true);
now.您可以使用如下内容:
params
变量是可选的。 它被视为可为空的对象数组。奇怪的是,我在文档中找不到任何有关此内容的信息,但它有效!
这是 Java 1.5 及更高版本中的“新功能”(Java 1.4 或更早版本中不支持)。
我看到用户 bhoot 在下面也提到了这一点。
You can use something like this:
The
params
variable is optional. It is treated as a nullable array of Objects.Strangely, I couldn't find anything about this in the documentation, but it works!
This is "new" in Java 1.5 and beyond (not supported in Java 1.4 or earlier).
I see user bhoot mentioned this too below.
Java 中没有可选参数。 您可以做的是重载函数然后传递默认值。
There are no optional parameters in Java. What you can do is overloading the functions and then passing default values.
已经提到了 VarArgs 和重载。 另一种选择是 Bloch Builder 模式,它看起来像这样:
尽管该模式最适合在构造函数中需要可选参数的情况。
VarArgs and overloading have been mentioned. Another option is a Bloch Builder pattern, which would look something like this:
Although that pattern would be most appropriate for when you need optional parameters in a constructor.
在JDK>1.5中你可以这样使用它;
In JDK>1.5 you can use it like this;
您可以使用方法重载来完成这样的事情。
您也可以使用 @Nullable 注释,
只需将 null 作为第一个参数传递即可。
如果您传递相同类型的变量,您可以使用它
You can do thing using method overloading like this.
Also you can use @Nullable annotation
simply pass null as first parameter.
If you are passing same type variable you can use this
简短版本:
使用三个点:
(基于@VitaliiFedorenko的回答)
Short version :
Using three dots:
(based on @VitaliiFedorenko's answer)
重载很好,但是如果有很多变量需要默认值,你最终会得到:
所以我建议使用 Java 提供的变量参数。
Overloading is fine, but if there's a lot of variables that needs default value, you will end up with :
So I would suggest use the Variable Argument provided by Java.
您可以使用一个与构建器非常相似的类来包含您的可选值,如下所示。
一样使用
像输出
要跳过所有可选值,您必须像
foo(o -> {});
那样调用它,或者如果您愿意,您可以创建第二个foo( )
不带可选参数的方法。使用这种方法,您可以按任何顺序指定可选值,而不会产生任何歧义。 与可变参数不同,您还可以拥有不同类的参数。 如果您可以使用注释和代码生成来创建 Options 类,那么这种方法会更好。
You can use a class that works much like a builder to contain your optional values like this.
Use like
Output is
To skip all the optional values you'd have to call it like
foo(o -> {});
or if you prefer, you can create a secondfoo()
method that doesn't take the optional parameters.Using this approach, you can specify optional values in any order without any ambiguity. You can also have parameters of different classes unlike with varargs. This approach would be even better if you can use annotations and code generation to create the Options class.
如果它是 API 端点,一种优雅的方法是使用“Spring”注释:
请注意,在这种情况下,innerFunc 将需要该变量,并且由于它不是 api 端点,因此无法使用此 Spring 注释来使其可选。
参考:https://www.baeldung.com/spring-request-param
If it's an API endpoint, an elegant way is to use "Spring" annotations:
Notice in this case that the innerFunc will require the variable, and since it's not api endpoint, can't use this Spring annotation to make it optional.
Reference: https://www.baeldung.com/spring-request-param
Java 现在支持 1.8 中的可选类型,我一直在 android 上编程,所以我一直使用 null,直到我可以重构代码以使用可选类型。
Java now supports optionals in 1.8, I'm stuck with programming on android so I'm using nulls until I can refactor the code to use optional types.
这是一个老问题,甚至可能在引入实际的可选类型之前,但现在您可以考虑一些事情:
- 使用方法重载
- 使用可选类型,其优点是避免传递 NULL
可选类型是在 Java 8 中引入的,之后通常在第三方库(例如 Google 的 Guava)中使用。 使用可选作为参数/参数可以被认为是过度使用,因为主要目的是将其用作返回时间。
参考:https://itcodehub.blogspot.com/ 2019/06/using-可选-type-in-java.html
This is an old question maybe even before actual Optional type was introduced but these days you can consider few things:
- use method overloading
- use Optional type which has advantage of avoiding passing NULLs around
Optional type was introduced in Java 8 before it was usually used from third party lib such as Google's Guava. Using optional as parameters / arguments can be consider as over-usage as the main purpose was to use it as a return time.
Ref: https://itcodehub.blogspot.com/2019/06/using-optional-type-in-java.html
Java 中不能使用默认参数。 在 C#、C++ 和 Python 中,我们可以使用它们。
在 Java 中,我们必须使用 2 个方法(函数),而不是一个带有默认参数的方法(函数)。
示例:
http://parvindersingh.webs.com/apps/forums/topics/show/8856498-java-how-to-set-default-parameters-values-like-c-
Default arguments can not be used in Java. Where in C#, C++ and Python, we can use them..
In Java, we must have to use 2 methods (functions) instead of one with default parameters.
Example:
http://parvindersingh.webs.com/apps/forums/topics/show/8856498-java-how-to-set-default-parameters-values-like-c-
我们可以通过方法重载或使用数据类型来制作可选参数...
|*| 方法重载:
最简单的方法是
|*| DataType...可以是可选参数
We can make optional parameter by Method overloading or Using DataType...
|*| Method overloading :
Easiest way is
|*| DataType... can be optional parameter
如果您计划使用具有多个参数的界面,
人们可以使用以下结构模式并实现或重写 apply - 一种基于您的要求的方法。
If you are planning to use an interface with multiple parameters,
one can use the following structural pattern and implement or override apply - a method based on your requirement.