2017-08-19 22 views
2

为什么我们使用这种形式? (这是一个关于Java的复数视域)构造子链

public MathEquation(char opCode) 
    { 
     this.opCode = opCode; 
    } 

public MathEquation(char opCode , double leftVal , double rightVal) 
    { 
     this(opCode); 
     this.leftVal = leftVal; 
     this.rightVal = rightVal; 
    } 

为什么不是这个?

public MathEquation(char opCode , double leftVal , double rightVal) 
    { 
     this.opCode = opCode 
     this.leftVal = leftVal; 
     this.rightVal = rightVal;  
    } 
+1

因为根据可用的参数,类可以以两种不同的方式构建? – Li357

+0

并明确说明有两种“通常”的方式来构造它。 –

回答

7

因为如果由于某种原因,你需要做更多的东西与操作码(如把它收藏起来之前为大写,或检查它在一定范围内,或者类似的东西),你不会必须在两个构造函数中重复该代码。一个人只会调用已经写在另一个中的代码。

这个一般原则被称为干:不要重复自己。

注意,它经常被在另外一个方向:最简单的构造函数调用中最复杂的一个,指定什么样的默认值以通为缺少参数:

public MathEquation(char opCode) { 
    this(opCode, 0.0, 0.0); 
} 
+0

所以我可以只写第二个构造函数以避免重复,但我们使用这种形式的链接允许我们...将opCode更改为“OpCode”? 以及你是什么意思的范围(对于编程来说很抱歉:D) – ShaDiliX

+0

不。假设作为参数传递的opCode是“p”,并且实际上你想将它存储为“P”(即将它转换为大写存储它)。或者假设调用者只能传递“a”和“z”之间的值(即在一些值范围内),构造函数需要检查该值是否确实在该值范围内。 –

+0

明白了(y)sry can not vote xD – ShaDiliX

2

的一点是:你希望尽量减少的数量不同工作构造函数。

从这个角度来看,最佳解决方案是一个arg构造函数调用3 arg构造函数(使其明确哪些默认值应该用于其他两个参数)!当你这样做时,只有一个构造函数会做某些事情 - 而在你的例子中,3参数构造函数做了一些调用另一个构造函数。

含义:在问题中使用的任何形式都不是理想的。

+0

好吗什么是理想形式? (注意:上面用于构造函数链接的构造函数) – ShaDiliX

+0

@ShaDiliX答案就在你面前,在答案的6行中:*最佳解决方案是,一个arg构造函数调用3参数构造函数*。仔细读。 –

+0

但他说这个问题中使用的两种形式都不是理想的......这就是为什么我问 – ShaDiliX

1

为了符合

的S - 单责任原则
Ø - 开放 - 封闭原则

下面的构造器负责只需一次人操作,如果在未来要扩展的功能,你可以轻松做到这一点。

public MathEquation(char opCode) 
{ 
    this.opCode = opCode; 
    //new functionality 
}