[英]apply java generic in gwt editor
I am using gwt editor framework to bind form in gwt. 我正在使用gwt编辑器框架来绑定gwt中的表单。 I was able to bind form successfully, but my problem is I need to write too many code.
我能够成功绑定表单,但我的问题是我需要编写太多代码。 I think using generic will shorten my code but I couldn't do it.
我认为使用泛型会缩短我的代码,但我无法做到。
The code for EditVendorWorkflow
is almost same, the only difference is this two line EditVendorWorkflow
的代码几乎相同,唯一的区别就是这两行
interface Driver extends SimpleBeanEditorDriver<Vendor, VendorEditor>{}
private VendorEditor editor;
Example, If I write a PersonEditor
the corresponding EditPersonWorkflow
code will have 例如,如果我编写
PersonEditor
则相应的EditPersonWorkflow
代码将具有
interface Driver extends SimpleBeanEditorDriver<Person, PersonEditor>{}
private PersonEditor editor;
So basically there is a repetition. 所以基本上有重复。
Any Help is appreciable. 任何帮助都很明显。
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();
}
}
Something along the following lines should do the job: 以下几行应该做的工作:
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;
}
}
But unfortunately, GWT.create()
can only accept a class literal, which cannot be generic. 但不幸的是,
GWT.create()
只能接受一个类文字,它不能是通用的。 So, I guess still you have to create your Driver
interfaces somewhere. 所以,我想你仍然需要在某处创建你的
Driver
接口。 I added a driver
parameter to initialize()
so that you can call GWT.create()
outside and pass the result in. 我在
initialize()
添加了一个driver
参数,以便您可以在外部调用GWT.create()
并传递结果。
If you have some codes that specific to Vendor
or Person
, you can abstract them in abstract methods like 如果您有一些特定于
Vendor
或Person
代码,您可以使用抽象方法来抽象它们
protected abstract void doSomethingWithEditedObject(O object);
and implement them in subclasses of EditWorkflow
. 并在
EditWorkflow
子类中实现它们。
If you go on to create subclasses of EditWorkflow
, you can put Driver
interfaces inside their respective EditWorkflow
class 如果继续创建
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...
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.