为什么你有两个具有相同签名的构造函数?

unj*_*nj2 10 java

具有相同签名的两个构造函数有什么用例?

编辑:你不能用Java做到这一点,因为Effective Java说你需要静态工厂.但我想知道你为什么要首先做到这一点.

CPe*_*ins 15

认为自己想要这样做的原因是您发现自己处于变量类型不足的情况.

例如,我可能会欺骗自己认为我需要给我的Point类两个构造函数:一个用X和Y工作,一个用度和弧度工作.两者都可以表示为浮点数.

所以我认为我需要两个具有相同签名的构造函数(float,float).

布洛赫博士指出,制作工厂方法更好:


    public static Point newPointByDegreesAndRadians (float degrees, float radians);
    public static Point newPointByXandY (float x, float y);
Run Code Online (Sandbox Code Playgroud)

顺便提一下,工厂方法的另一种替代方法是创建带有数据类型中缺少的上下文的类型,如下所示:


    public class CoordinatesXY {
       float X;
       float Y;
       ...
    }
    public class CoordinatesDegreesRadians {
       float degrees;
       float radians;
       ...
    }
    public Point (CoordinatesXY coordinates) { ... }
    public Point (CoordinatesDegreesRadians coordinates) { ... }
Run Code Online (Sandbox Code Playgroud)

您是否认为这比工厂方法更清晰是一个品味问题.对于这种特殊情况,我自己的感觉是,如果你的设计使坐标有用,与这些坐标上的点分开,那么两个坐标类才有用.


Gil*_*anc 11

您希望拥有两个(或更多)具有相同签名的构造函数的原因是数据类型与含义不同义.

一个简单的例子是Line类.

这是一个构造函数: public class Line(double x1, double y1, double x2, double y2)

这是另一个: public class Line(double x1, double y1, double angle, double distance)

第一个构造函数定义了一条线的两个端点.第二个构造函数定义一个端点,以及到第二个端点的角度和距离.

Java无法区分两个Line类构造函数,true.但是有两个或更多构造函数具有相同签名的充分理由.


akf*_*akf 5

一个Class不能有两个具有相同签名的构造函数.

来自JLS:

8.8.2构造函数签名

在类中声明具有覆盖等效(§8.4.2)签名的两个构造函数是编译时错误.声明两个构造函数的编译时错误,其签名在类中具有相同的擦除(第4.6节).

  • 我知道Java不允许这样做.这就是我们需要静态工厂的原因.但是为什么我们需要在这个地方创建不同的构造函数. (2认同)