【问题标题】:Refactor constructor with similar arguments重构具有相似参数的构造函数
【发布时间】:2018-04-24 17:40:07
【问题描述】:

我想重构以下代码:

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);
}

我怎样才能同时拥有构造函数并且不重复代码?

【问题讨论】:

  • 调用这个(arg1,agr2,.....)

标签: java refactoring


【解决方案1】:

我怎样才能同时拥有构造函数并且不重复代码?

几种方法:

  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

【讨论】:

    【解决方案2】:

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

    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); 
    }
    

    【讨论】:

    • ...假设使用完全未初始化的实例调用calcularCredito 是可以的,这...不是一个安全的假设。它还鼓励从构造函数调用方法,isn't generally a good idea.
    • 我不反对。
    【解决方案3】:

    你可以使用这样的东西。

    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);
    }
    

    【讨论】:

    • ...假设使用几乎完全未初始化的实例调用calcularCredito 是可以的,这...不是一个安全的假设。它还鼓励从构造函数调用方法,isn't generally a good idea.
    • 这取决于您的情况。有时您需要根据某些参数在构造函数中执行各种业务逻辑。在这种情况下,我们可以使用私有函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多