public void methodA(A arg1) { }
public void methodA( B arg2,) { }
public void methodA(C arg3) { }
public void methodA(A arg1, B arg2) { }
public void methodA(A arg1, C arg3) { }
public void methodA( B arg2, C arg3) { }
public void methodA(A arg1, B arg2, C arg3) { }
Object canBeNull() {
if (blah) {
return new Object();
} else {
return null;
}
}
Object optionalObject = canBeNull();
if (optionalObject != null) {
// new object returned
} else {
// no new object returned
}
16 回答
重载很好,但如果有很多变量需要默认值,你最终会得到:
所以我建议使用Java提供的Variable Argument . 这是link的解释 .
Java现在支持1.8中的选项,我坚持使用android上的编程,所以我使用空值,直到我可以重构代码以使用可选类型 .
varargs可以做到这一点(在某种程度上) . 除此之外,必须提供方法声明中的所有变量 . 如果希望变量是可选的,则可以使用不需要参数的签名重载方法 .
有几种方法可以在Java中模拟可选参数:
这种方法的一个限制是,如果您有两个相同类型的可选参数并且可以省略其中任何一个,则它不起作用 .
a)所有可选参数的类型相同:
b)可选参数的类型可能不同:
这种方法的主要缺点是,如果可选参数属于不同类型,则会丢失静态类型检查 . 此外,如果每个参数具有不同的含义,您需要某种方式来区分它们 .
现在必须提供所有参数值,但默认值可以为null .
可选为调用者显示方法 Contract ,但是,人们可能会发现这样的签名过于冗长 .
更新:Java 8包含了类
java.util.Optional
开箱即用的类,因此在Java 8中不需要为此特殊原因使用guava . 但方法名称有点不同 .在Java 9中,这种方法变得更容易:
请注意,您可以结合使用这些方法中的任何一种来获得理想的结果 .
你可以使用这样的东西:
params
变量是可选的 . 它被视为可以为对象的可空数组 .奇怪的是,我在文档中找不到任何相关内容,但它确实有效!
这在Java 1.5及更高版本中是“新的”(Java 1.4或更早版本不支持) .
我看到用户bhoot也提到了这一点 .
Java 5.0有可选参数 . 只需声明你的函数:
你现在可以用
doSomething();
或doSomething(true);
来打电话 .Java中没有可选参数 . 你可以做的是重载函数,然后传递默认值 .
遗憾的是,Java不直接支持默认参数 .
但是,我编写了一组JavaBean注释,其中一个支持默认参数,如下所示:
注释处理器生成方法重载以正确支持它 .
见http://code.google.com/p/javadude/wiki/Annotations
http://code.google.com/p/javadude/wiki/AnnotationsDefaultParametersExample的完整示例
已经提到了VarArgs和重载 . 另一种选择是Builder模式,它看起来像这样:
虽然该模式最适合在构造函数中需要可选参数时 .
在JDK> 1.5中,您可以像这样使用它;
这取决于你想要实现什么,varargs或方法重载应该解决大多数情况 .
但请记住不要过度使用方法重载 . 它带来了混乱 .
短版:
使用 three dots :
(根据@ VitaliiFedorenko的回答)
你可以像这样使用方法重载做事 .
您也可以使用@Nullable注释
只需将null作为第一个参数传递 .
如果您传递的是同一类型变量,则可以使用此变量
您可以使用类似于构建器的类来包含这样的可选值 .
使用像
输出是
要跳过所有可选值,您必须将其称为
foo(o -> {});
,或者如果您愿意,可以创建第二个foo()
方法,该方法不接受可选参数 .使用此方法,您可以按任何顺序指定可选值,而不会产生任何歧义 . 与varargs不同,您还可以使用不同类的参数 . 如果您可以使用注释和代码生成来创建Options类,那么这种方法会更好 .
Default arguments can not be used in Java and C#. Where in C++ and Python, we can use them..
在Java中,我们必须使用2个方法(函数)而不是一个使用默认参数 .
例:
http://parvindersingh.webs.com/apps/forums/topics/show/8856498-java-how-to-set-default-parameters-values-like-c-
我们可以通过Method重载或使用DataType来创建可选参数...
| * |方法重载:
最简单的方法是
| * | DataType ...可以是可选参数