假设我有2个字段的类:x和y,类型为double
。是否可以定义2个构造函数,以便构造函数1创建对象,将其x
属性设置为构造函数中的哪个参数告诉,y
为默认值,构造函数2反之亦然?
public class Test {
private int x;
private int y;
public Test(int x) {
this.x = x;
}
public Test(int y) {
this.y = y;
}
}
我正在尝试这样的事情,我知道因为超载规则而无法正常工作
答案 0 :(得分:8)
不,你不能这样做。通常你会做类似的事情:
private Test(int x, int y) {
this.x = x;
this.y = y;
}
public static Test fromX(int x) {
return new Test(x, 0);
}
public static Test fromY(int y) {
return new Test(0, y);
}
你可能想要考虑那种模式(公共静态工厂方法反过来调用私有构造函数),即使你没有有重载问题 - 它也清楚地说明了你的价值意义是什么传递意味着。
答案 1 :(得分:2)
不,您不能拥有两个具有相同签名的方法或构造函数。你能做的就是命名静态工厂。
public class Test {
private int x;
private int y;
private Test(int x, int y) {
this.x = x;
this.y = y;
}
public static Test x(int x) { return new Test(x, 0); }
public static Test y(int y) { return new Test(0, y); }
}
Test x1 = Test.x(1);
Test y2 = Test.y(2);
答案 2 :(得分:0)
不,x和y具有相同的类型,因此两个构造函数都具有相同的类型签名,方法解析基于参数类型,而不是名称;编译器无法区分。
编译器查找" Test.Test(int)"无论参数的名称是什么。
语言需要添加额外的功能,例如命名参数,才能做到你想要的。
如果Java获得了类似C#的语法用于属性初始化,那么您将能够使用该惯用语,使用默认的no-args构造函数。
除了使用显式工厂方法的替代方法之外,您还可以为参数传入HashMap。
public Test(HashMap<string,int> args) {
if(args.containsKey("x"))
x = args.get("x");
if(args.containsKey("y"))
y = args.get("y");
}
但是大多数情况下静态工厂方法更清晰。如果您需要更多,您可能需要首先考虑为什么需要这样的习语,并修改您的课堂设计。