jdk8 参数为方法
有时在Java中命名方法参数确实很不错,这看起来可能已经很长时间了,但是始终还有其他一些解决方法,例如使用构建器模式来获得类似的行为,这将为一点点。 在我看来,使用JDK 8中的Lambda支持可以使您获得非常接近的效果,而无需其他一些方法所需要的模板。
因此,请考虑这个简单的Facade类,该类提供了带有可变参数列表的方法。 请注意,该方法带有一个Consumer对象,这是我们稍后将要使用Lambda调用的方法。
package client;
import java.util.function.Consumer;
public class Facade {
public static void invoke(Consumer<Parameter> op) {
Parameter p = new Parameter();
op.accept(new Parameter());
invoke(p);
}
public static void invoke(Parameter p) {
// Defensive copy and validate
p = p.clone();
p.validate();
// ...
}
public static class Parameter implements Cloneable {
public String value1, value2, value3;
public Parameter validate() {
// ...
return this;
}
public Parameter clone() {
// We can use vanilla clone here, for more complicated mutable objects
// you might need to perform a deeper copy
try {
return (Parameter) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
}
}
因此,一旦有了这些,就可以使用Lambda表示法调用具有您认为合适的参数数量的invoke方法:
...
{
public static void main(String[] args) {
// Single parameter version
Facade.invoke(p -> p.value1="x" );
// Multiple parameter version
Facade.invoke(p -> { p.value1="x"; p.value2="y";});
}
}
当然,您的鹰眼将意识到,使用早期的JDK,相同的模式,当然减去了Consumer
方法。 考虑到那里有大量的Java开发人员,可能已经有人发明了这种模式。 但您永远不知道,如果不写下来,就不会发生。
...
{
public static void main(String[] args) {
// Using an anonymous inner class pre JDK 8
Facade.invoke(new Parameter() {{
value1 = "x";
value2 = "y";
}});
}
}
翻译自: https://www.javacodegeeks.com/2013/08/almost-named-method-arguments-in-jdk-8.html
jdk8 参数为方法