use*_*783 5 java generics gwt editor
我正在使用gwt编辑器框架来绑定gwt中的表单.我能够成功绑定表单,但我的问题是我需要编写太多代码.我认为使用泛型会缩短我的代码,但我无法做到.
代码EditVendorWorkflow几乎相同,唯一的区别是这两行
interface Driver extends SimpleBeanEditorDriver<Vendor, VendorEditor>{}
private VendorEditor editor;
Run Code Online (Sandbox Code Playgroud)
例如,如果我写了PersonEditor相应的EditPersonWorkflow代码就会有
interface Driver extends SimpleBeanEditorDriver<Person, PersonEditor>{}
private PersonEditor editor;
Run Code Online (Sandbox Code Playgroud)
所以基本上有重复.
任何帮助都很明显.
public class EditVendorWorkflow{
interface Driver extends SimpleBeanEditorDriver<Vendor, VendorEditor>{}
Driver driver = GWT.create(Driver.class);
private VendorEditor editor;
void edit(Vendor p) {
driver.initialize(editor);
driver.edit(p);
}
void save() {
Vendor edited = driver.flush();
//doSomethingWithEditedVendor(edited);
}
public void initialize(VendorEditor editor) {
this.editor = editor;
}
}
public class VendorEditor extends Composite implements Editor<Vendor> {
private static VendorEditorUiBinder uiBinder = GWT
.create(VendorEditorUiBinder.class);
@UiField Button save;
@UiField TextBox address;
@UiField TextBox contactName;
@UiField ValueBoxEditorDecorator<String> contactMobileNo;
@Path("department.name")
@UiField TextBox deptName;
interface VendorEditorUiBinder extends UiBinder<Widget, VendorEditor> {
}
private final EditVendorWorkflow vendorDriver;
public VendorEditor(Vendor p) {
initWidget(uiBinder.createAndBindUi(this));
vendorDriver = GWT.create(EditVendorWorkflow.class);
vendorDriver.initialize(this);
vendorDriver.edit(p);
}
@UiHandler("save")
void onSaveClick(ClickEvent event) {
vendorDriver.save();
}
}
Run Code Online (Sandbox Code Playgroud)
按照以下几行应该可以完成这项工作:
public class EditWorkflow<O, E extends Editor<O>> {
SimpleBeanEditorDriver<O, E> driver;
private E editor;
void edit(O p) {
driver.initialize(editor);
driver.edit(p);
}
void save() {
O edited = driver.flush();
//doSomethingWithEditedObject(edited);
}
public void initialize(E editor, SimpleBeanEditorDriver<O, E> driver) {
this.editor = editor;
this.driver = driver;
}
}
Run Code Online (Sandbox Code Playgroud)
但不幸的是,GWT.create()只能接受类文字,不能泛型。所以,我想你仍然必须Driver在某个地方创建你的界面。我添加了一个driver参数,initialize()以便您可以GWT.create()在外部调用并将结果传入。
如果您有一些特定于Vendor或 的代码Person,您可以使用抽象方法来抽象它们,例如
protected abstract void doSomethingWithEditedObject(O object);
Run Code Online (Sandbox Code Playgroud)
并在 的子类中实现它们EditWorkflow。
如果您继续创建 的子类EditWorkflow,则可以将Driver接口放入各自的EditWorkflow类中
public class EditVendorWorkflow extends EditWorkflow<Vendor, VendorEditor> {
interface Driver extends SimpleBeanEditorDriver<Vendor, VendorEditor>{}
public void initialize(VendorEditor editor) {
super.initialize(editor, GWT.create(Driver.class));
}
@Override
protected void doSomethingWithEditedObject(Vendor object) {
// Code specific to class Vendor...
}
}
Run Code Online (Sandbox Code Playgroud)