8

我有一个在表格布局中创建行的类。行的创建取决于数据和元数据。由于元数据对于每一行都是相同的,例如显示/隐藏可见性属性等,所以我将元数据属性创建为静态并使用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 方法。

提前致谢。

4

6 回答 6

1

我会建议建造者模式。您将需要一个额外的类来创建 RowWidget 对象。所以调用看起来像这样:

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

这是对该模式的简洁解释:https ://stackoverflow.com/a/1953567/991164

于 2013-05-28T08:45:49.073 回答
0

RowWidget您可以在 -class 中从-class 中分离/提取参数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 ...
    }
}
于 2013-05-28T07:08:52.823 回答
0

静态的 initWidget() 似乎不适合我。虽然现在您可能只有一组RowWidget共享某些属性的 s,但拥有 2 组 s 也是合理RowWidget的,每组都有自己的“共享”属性。如果您重构代码以进行更合理的设计,事情将会更加流畅,并且您在构建更合理的 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);

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

于 2013-05-28T07:14:27.633 回答
0

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

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

class A{
  public A(int p1, int p2){...}
  public A create(int p2) {
    return new A(this.p1,p2);
}
于 2013-05-28T08:41:40.933 回答
0

为什么不创建将接受您要更改的属性的 newValues 的方法,并返回类的新实例以及从您调用此方法的实例复制的所有其他属性。

于 2013-05-28T07:05:08.560 回答
0

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

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

为所有实例设置一些默认修复属性的类的最佳构造方法是什么?

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

于 2013-05-28T07:06:17.287 回答