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

0 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);
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能拥有这两个构造函数并且不需要复制代码?

T.J*_*der 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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    重新See warning- 一般来说,由于各种原因,从构造函数调用方法是有问题的; 看到这个问题的答案更多.

  2. 使用构建器模式,无论如何您都可以使用它.更多在这个答案和(不那么)这个问题的答案.