我有一个在表格布局中创建行的类。行创建取决于数据和元数据。由于每个行的元数据都相同,例如显示/隐藏可见性属性等,因此我创建了元数据属性作为静态,并使用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方法。
提前致谢。
答案 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);
}