5

gwtエディターフレームワークを使用してgwtのフォームをバインドしています。フォームを正常にバインドできましたが、問題は、あまりにも多くのコードを記述する必要があることです。ジェネリックを使用するとコードが短くなると思いますが、できませんでした。

のコードEditVendorWorkflowはほぼ同じですが、唯一の違いはこの2行です

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

1 に答える 1

2

次の線に沿った何かが仕事をするはずです:

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ですから、それでもどこかにインターフェースを作成する必要があると思います。外部に呼び出して結果をに渡すことができるように、にdriverパラメータを追加しました。initialize()GWT.create()

Vendorまたはに固有のコードがある場合はPerson、次のような抽象メソッドでそれらを抽象化できます。

protected abstract void doSomethingWithEditedObject(O object); 

のサブクラスにそれらを実装しますEditWorkflow

のサブクラスを作成し続ける場合は、それぞれのクラス内にインターフェイスEditWorkflowを配置できますDriverEditWorkflow

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...
    }
}
于 2012-10-19T16:58:51.857 に答える