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 validatep = 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 copytry {return (Parameter) super.clone();} catch (CloneNotSupportedException e) {throw new RuntimeException(e);}}}}
因此,一旦有了这些,就可以使用Lambda表示法调用具有您认为合适的参数数量的invoke方法:
...
{public static void main(String[] args) {// Single parameter versionFacade.invoke(p -> p.value1="x" );// Multiple parameter versionFacade.invoke(p -> { p.value1="x"; p.value2="y";});}
}
当然,您的鹰眼将意识到,使用早期的JDK,相同的模式,当然减去了Consumer
方法。 考虑到那里有大量的Java开发人员,可能已经有人发明了这种模式。 但您永远不知道,如果不写下来,就不会发生。
...
{public static void main(String[] args) {// Using an anonymous inner class pre JDK 8Facade.invoke(new Parameter() {{value1 = "x";value2 = "y";}});}
}
参考: 在我们的JCG合作伙伴 Gerard Davison的博客博客中,JDK 8中几乎命名的方法参数 。
翻译自: https://www.javacodegeeks.com/2013/08/almost-named-method-arguments-in-jdk-8.html
jdk8 参数为方法