java - 在 gwt 编辑器中应用 java 泛型

标签 java gwt generics editor

我正在使用 gwt 编辑器框架在 gwt 中绑定(bind)表单。我能够成功绑定(bind)表单,但我的问题是我需要编写太多代码。我认为使用泛型会缩短我的代码,但我做不到。

EditVendorWorkflow 的代码几乎相同,唯一不同的是这两行

interface Driver extends  SimpleBeanEditorDriver<Vendor, VendorEditor>{}
private VendorEditor editor;

例如,如果我编写一个PersonEditor,则相应的EditPersonWorkflow 代码将具有

interface Driver extends  SimpleBeanEditorDriver<Person, PersonEditor>{}
private PersonEditor editor;

所以基本上有重复。

任何帮助都是值得赞赏的。

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();
    }
}

最佳答案

按照以下几行应该可以完成这项工作:

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;
    }

}

但不幸的是,GWT.create() 只能接受类字面量,不能泛型。所以,我想你仍然必须在某处创建你的 Driver 接口(interface)。我在 initialize() 中添加了一个 driver 参数,以便您可以在外部调用 GWT.create() 并将结果传入。

如果您有一些特定于VendorPerson 的代码,您可以将它们抽象为抽象方法,例如

protected abstract void doSomethingWithEditedObject(O object); 

并在 EditWorkflow 的子类中实现它们。

如果您继续创建 EditWorkflow 的子类,您可以将 Driver 接口(interface)放入它们各自的 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...
    }
}

关于java - 在 gwt 编辑器中应用 java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12927231/

相关文章:

java - GWT 将大量数据从服务器发送到客户端的最佳实践

java - JAX-RS POST bean 属性的默认值

java - 将变量从 java 传递到 SQL IN 子句

gwt - 如何向 FlowPanel 添加边距?

C# - 使用泛型类型的方法的实现

c# - 为什么包含命名参数会导致 "type arguments for method cannot be inferred from usage"错误?

.net - 如何尽快删除 SortedDictionary 的第二个元素?

java - Spring Boot "No message available"错误(状态 = 404),

java - Gson:JsonSyntaxException:应为 BEGIN_OBJECT 但为 STRING

java - libGDX html :draftCompileGwt Compilation Error