在构造函数中传递参数的最佳方法

时间:2013-05-28 06:52:57

标签: java design-patterns

我有一个在表格布局中创建行的类。行创建取决于数据和元数据。由于每个行的元数据都相同,例如显示/隐藏可见性属性等,因此我创建了元数据属性作为静态,并使用initWidget RowWidget初始化一次。

只是示例:

class RowWidget extends FlexTable{

  public static void initWidget(Form form,
    HashMap<Long, ContractorPermissionEnum> formModePermissionMap,
    GridMode gridMode,
    boolean isApplied,
    boolean isChildExist,
    boolean isChildAttachment)
    { 
      // ...
    }
}

然后我为每个记录数据调用了下面的构造函数。

public RowWidget(DataRawType dataRawType, Data data, Data parentData) {
 // ...
}

我认为这不是正确的方法。因为作为模式,任何人看到这个类,然后理解它将创建一行。我最初不想打电话initWidget。我想只在构造函数中传递每个必需参数,如

public RowWidget(DataRawType dataRawType,
  Data data,
  Data parentData,
  Form form,
  HashMap<Long, ContractorPermissionEnum> formModePermissionMap,
  GridMode gridMode,
  boolean isApplied,
  boolean isChildExist,
  boolean isChildAttachment) {
  // ...
}

但由于这个原因,构造函数没有参数。我认为在构造函数中有5+参数也是不好的模式。

有人建议我:

  • 如何构造另一个具有相同属性的类 实例

注意:我知道这只能通过静态实现,但不想使用静态。

  • 使用一些默认修复来构造类的最佳方法是什么 所有实例的属性?

注意:我不想创建另一个类来实现它。或任何getter / setter方法。

提前致谢。

6 个答案:

答案 0 :(得分:1)

我会建议构建模式。您将需要一个额外的类来创建RowWidget对象。所以电话会是这样的:

RowWidget widget = new RowWidget.Builder().withData(data).withParentData(parentData).withDataRawType(dataRawType).build();

以下是模式的简洁解释:https://stackoverflow.com/a/1953567/991164

答案 1 :(得分:0)

为什么不创建接受要更改的属性的newValues的方法&amp;返回一个新的类实例,其中包含从您调用此方法的实例中复制的所有其他属性。

答案 2 :(得分:0)

  

如何构造另一个实例中需要相同属性的类?

要实现这一目标,您可以拥有一个包含所需属性的超类。所以扩展这个超类的任何类都将具有这些属性。这样您就不需要使用static关键字。

  

构造具有所有实例的默认修复属性的类的最佳方法是什么?

对于这个,您可以拥有一些具有一些常量属性的接口。这样,实现此接口的任何类都将具有固定属性。

答案 3 :(得分:0)

您可以在RowWidget - 类中的RowWidgetConfig - 类中分离/提取参数。

class RowWidgetConfig {
    // put here all your parameters that you need to initialize only once
    // init using setters
}

现在创建该类的一次实例,并将其在其他参数中传递给RowWidget构造函数。

另一种方法是让factory用于创建RowWidget个实例。工厂还将包含行实例所需的所有参数以及工厂方法createNewRowWidget,它会根据工厂中包含的参数创建实例。

class RowWidgetFactory {
    // put here all your parameters that you need to initialize only once
    // init using setters

    public RowWidget createNewRowWidget() {
        // create
        return ...
    }
}

答案 4 :(得分:0)

静态initWidget()对我来说似乎不合适。虽然现在可能只有一组RowWidget共享一些属性,但拥有2组RowWidget s也是合理的,每组都有自己的“共享”属性。如果您重构代码以使设计更合理,那么事情会更流畅,您在构建更合理的API方面有更多选择

现在假设我介绍类似RowGroup的东西(哪种代表你提到的“共享”东西)

(老实说,我对你的设计没有意义,我只是根据你的代码进行补充);

public class RowGroup {
    public RowGroup(Form form,
                    HashMap<Long, ContractorPermissionEnum> formModePermissionMap,
                    GridMode gridMode,
                    boolean isApplied,
                    boolean isChildExist,
                    boolean isChildAttachment) { .... }

    public void addRow(DataRawType dataRawType, Data data, Data parentData) {...}
}

当人们使用时,它看起来像:

RowGroup rowGroup = new RowGroup(form, permissionMap, gridMode, isApplied, isChildExist, isChildAttach);
rowGroup.addRow(DataRawType.A, dataA, parentA);
rowGroup.addRow(DataRawType.B, dataB, parentB);

您甚至可以提供类似构建器的语法或许多其他选择。

RowGroup rowGroup 
        = new RowGroup(.....)
              .addRow(DataRawType.A, dataA, parentA)
              .addRow(DataRawType.B, dataB, parentB);

更重要的是,设计现在对我来说更有意义。

答案 5 :(得分:0)

如果您不想创建另一个课程,我会建议A4L建议的内容。 在不创建另一个类的情况下,我将创建构造函数,该构造函数接受使用当前实例作为模板的所有参数和工厂方法,并将其自己的参数传递给构造函数参数。

示例(有明显的部分省略)

class A{
  public A(int p1, int p2){...}
  public A create(int p2) {
    return new A(this.p1,p2);
}