Java:如何在一个定义中组合具有多个签名的方法?
在给定的类中,我有Java:如何在一个定义中组合具有多个签名的方法?,java,methods,syntax,parameters,signature,Java,Methods,Syntax,Parameters,Signature,在给定的类中,我有.methodA()或方法a(参数) 这不仅仅是一种方法,大约有20种方法 因此,我不想使用重载,因为这将导致约30%的代码膨胀 我发现了一些相关的问题,但其中一些是关于1-n的一些参数。。。我有没有参数的方法调用。 其他的问题只是说我不能也需要使用重载,但是这些问题已经存在了好几年了——也许Java神从那时起就慷慨大方了 ()有时人们看到一张地图正在经过;原始的。但是考虑到你正在谈论的可能是20种参数的变化,比如属性,一个没有经过严格处理的映射,可能还可以。这甚至可以作为键-
.methodA()
或方法a(参数)代码>
这不仅仅是一种方法,大约有20种方法代码>
因此,我不想使用重载,因为这将导致约30%的代码膨胀
我发现了一些相关的问题,但其中一些是关于1-n的一些参数。。。我有没有参数的方法调用。
其他的问题只是说我不能也需要使用重载,但是这些问题已经存在了好几年了——也许Java神从那时起就慷慨大方了
()有时人们看到一张地图正在经过;原始的。但是考虑到你正在谈论的可能是20种参数的变化,比如属性,一个没有经过严格处理的映射,可能还可以。这甚至可以作为键-值对的流畅api传递。自java 9以来:
obj.method(Map.of("a", 1,
"b", 2,
"c", 3));
有一种解决方案非常冗长,将所有参数存储在自己的类中,
但允许完整性约束和检查,例如通过A或通过B和C,将A设置为f(B,C)
您可以使用生成器模式。它在最后带有一个对象创建,其中的字段包含所有可能的参数
在使用构建器时有几种不同的方法。最适用于这种情况的是:
void method(Param param) { ... }
public class Param {
public final String s;
public final int x;
public final int y;
private Param(String s, int x, int y) {
this.s = s;
this.x = x;
this.y = y;
}
public static ParamBuilder newParam() { // Possibly obligatary parameters.
return new ParamBuilder();
}
这确保使用特殊的构建来开始构建参数
public static class ParamBuilder {
private String s;
private int x;
private int y;
private ParamBuilder() { };
public ParamBuilder withS(String s) {
...; return this;
}
public ParamBuilder withXY(int x, int y) {
...; return this;
}
public Param build() {
// Possible integrity checks for completeness.
return new Param(s, x, y);
}
}
}
用法:
object.method(Param.newParam().withXY(3, 4).withZ(5).build());
object.pMethod().withXY(3, 4).withZ(5)).call();
// | |
// newParam method(build())
你能展示一些代码来说明这个问题吗?Varargs也可以使用0个参数,例如methodA(String…strings)
也可以接受0个参数,而不仅仅是1-n个参数。没有代码示例很难回答你的问题。我非常喜欢在获得免费建议之前展示工作,但是在这种情况下,我已经展示了理解问题在逻辑上需要的所有代码。我的意思是,我可以举一个方法重载的例子,但这对任何人都没有用处。你怎么称呼这个“…”语法?什么时候引入的?@DraxDomax它被称为变量参数(Varargs),是在Java 5中引入的。Joe,我真的很想接受你的回答,请你看看表达式应该是“Object…args”还是“Object…args”。我在代码中使用了后者(取得了巨大成功),但不确定哪种语法是正确的
object.method(Param.newParam().withXY(3, 4).withZ(5).build());
object.pMethod().withXY(3, 4).withZ(5)).call();
// | |
// newParam method(build())