具有类似参数的重构构造函数

时间:2018-04-24 17:40:08

标签: java refactoring

我想重构以下代码:

public Credito(String numero, String titular, LocalDate fechacaducidad, double credito, int marcainternacional,
            String nombreentidad, int ccv) {
        mNumero = numero;
        mTitular = titular;
        mFechaDeCaducidad = fechacaducidad;
        mCredito = credito;
        mMovimientos = new Vector<Movimiento>();
        mMarcaInternacional = marcainternacional;
        setmNombreEntidad(nombreentidad);
        setmCCV(ccv);
    }

public Credito(String numero, String titular, LocalDate fechacaducidad, int tipo, int marcainternacional,
        String nombreentidad, int ccv) {
    mNumero = numero;
    mTitular = titular;
    mFechaDeCaducidad = fechacaducidad;
    mTipo = tipo;
    mCredito = calcularCredito(mTipo);
    mMovimientos = new Vector<Movimiento>();
    mMarcaInternacional = marcainternacional;
    setmNombreEntidad(nombreentidad);
    setmCCV(ccv);
}

如何同时拥有两个构造函数并且不执行代码?

3 个答案:

答案 0 :(得分:6)

  

如何同时拥有两个构造函数并且不执行代码?

有两种方式:

  1. 有一个私有的构造函数,它们都与公共部分链接在一起,然后在调用之后让每个构造函数都自己做。例如:

    private Credito(String numero, String titular, LocalDate fechacaducidad, int marcainternacional,
            String nombreentidad, int ccv) {
        mNumero = numero;
        mTitular = titular;
        mFechaDeCaducidad = fechacaducidad;
        mMovimientos = new Vector<Movimiento>();
        mMarcaInternacional = marcainternacional;
        setmNombreEntidad(nombreentidad); // *** See warning
        setmCCV(ccv);                     // *** See warning
    }
    
    public Credito(String numero, String titular, LocalDate fechacaducidad, double credito, int marcainternacional,
            String nombreentidad, int ccv) {
        this(numero, titular, fechacaducidad, marcainternacional, nombreentidad, ccv);
        mCredito = credito;
    }
    
    public Credito(String numero, String titular, LocalDate fechacaducidad, int tipo, int marcainternacional,
            String nombreentidad, int ccv) {
        this(numero, titular, fechacaducidad, marcainternacional, nombreentidad, ccv);
        mTipo = tipo;
        mCredito = calcularCredito(mTipo);
    }
    

    Re See warning - 一般来说,由于各种原因,从构造函数调用方法会出现问题; see this question's answers了解更多信息。

  2. 使用builder pattern,考虑到你有多少参数,这可能会很有用。更多this answer和(不那么)this question's answers

答案 1 :(得分:1)

第二个构造函数可以简单地变为:

public Credito(String numero, String titular, LocalDate fechacaducidad, int tipo, int marcainternacional,
        String nombreentidad, int ccv) {
    this(numero, titular, fechacaducidad, calcularCredito(mTipo), marcainternacional, nombreentidad, ccv); 
}

答案 2 :(得分:0)

你可以使用这样的东西。

public Credito(String numero, String titular, LocalDate fechacaducidad, double credito, int marcainternacional,
        String nombreentidad, int ccv) {
    mCredito = credito;
    setmNombreEntidad(nombreentidad);
    commonFunction(numero, titular, fechacaducidad,  marcainternacional, nombreentidad, ccv);
}

public Credito(String numero, String titular, LocalDate fechacaducidad, int tipo, int marcainternacional,
        String nombreentidad, int ccv) {
    mTipo = tipo;
    mCredito = calcularCredito(mTipo);
    setmNombreEntidad(nombreentidad);
    commonFunction(numero, titular, fechacaducidad,  marcainternacional, nombreentidad, ccv);
}

private void commonFunction(String numero, String titular, LocalDate fechacaducidad,  int marcainternacional,
        String nombreentidad, int ccv) {
    mNumero = numero;
    mTitular = titular;
    mFechaDeCaducidad = fechacaducidad;
    mMovimientos = new Vector<Movimiento>();
    mMarcaInternacional = marcainternacional;
    setmCCV(ccv);
}