2012-10-17 15 views
5

में जावा जेनेरिक लागू करें मैं gwt में फॉर्म बांधने के लिए gwt संपादक ढांचे का उपयोग कर रहा हूं। मैं सफलतापूर्वक फॉर्म को बांधने में सक्षम था, लेकिन मेरी समस्या है कि मुझे बहुत सारे कोड लिखने की ज़रूरत है। मुझे लगता है कि जेनेरिक का उपयोग करके मेरे कोड को छोटा कर दिया जाएगा लेकिन मैं इसे नहीं कर सका।gwt संपादक

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

उत्तर

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 इंटरफ़ेस बनाना है। मैं initialize() करने के लिए एक driver पैरामीटर जोड़ा ताकि आप GWT.create() बाहर कॉल और में परिणाम दे सकते हैं।

आप कुछ कोड है, तो है कि विशिष्ट को Vendor या Person, आप कर सकते हैं उन्हें सार तरह

protected abstract void doSomethingWithEditedObject(O object); 
सार तरीकों में

और 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... 
    } 
} 
+0

धन्यवाद यह काम किया डाल सकते हैं – user510783