La struttura del nostro progetto separa strongmente le tre diverse parti:
- core - classi di dati, POJO, talvolta aggregati con annotazioni (ad esempio per serializzazione XML / JSON)
- plug-in : plug-in per una grande applicazione aziendale basata su Swing
- ui - componenti UI aggiuntivi in JavaFX, utilizza solo le core classi di dati
Ora vogliamo implementare i trasferimenti drag-and-drop tra l'interfaccia utente in JavaFX e il plugin in Swing. Grazie ad una su StackOverflow , ci sono < strong> no altri problemi tecnici nell'implementazione.
Tuttavia, non so dove inserire la meta informazione su come le strutture di dati dovrebbero essere trasferite attraverso il sistema operativo. Per Swing, ho bisogno di definire (o riutilizzare) un DataFlavor
, in JavaFX è richiesto un DataFormat
. Entrambe queste classi si basano su una semplice stringa che dovrebbe / deve contenere un tipo MIME, ad es. text/plain
o application/x-some-custom-data
. Ma dove dovrebbe essere definito questo tipo di informazioni?
-
Idea : memorizza il
DataFormat
/DataFlavor
direttamente nella classe che lo utilizza, ad es. un controller:class MyController { public static final DataFormat FORMAT = new DataFormat("x-some-custom-data"); // ... ClipboardContent content = new ClipboardContent(); content.put(FORMAT, myDataObject); // ... } // equivalent for Swing part
Svantaggio : le stesse informazioni devono essere archiviate in luoghi diversi.
-
Idea : salva
DataFormat
/DataFlavor
direttamente nella classe che viene trasferita:class MyDataClass { public static final DataFormat FORMAT = new DataFormat("x-some-custom-data"); public static final DataFlavor FLAVOR = ... // some fields / getters / setters ... } // ... ClipboardContent content = new ClipboardContent(); content.put(MyDataClass.FORMAT, myDataObject); // ... // equivalent for Swing part
Svantaggio : le classi specifiche del framework vengono utilizzate all'interno di classi di dati puri (anche se appartengono al framework Java standard).
-
Idea : memorizza le informazioni nella classe che viene trasferita, ma crea le classi specifiche del framework (
DataFormat
/DataFlavor
) da qualche altra parte:@TransferAs("application/x-some-custom-data") class MyDataClass { } // ... DataFormat format = new DataFormat(myDataObject.getClass().getAnnotation(TransferAs.class).value()); // ... // equivalent for Swing part
Svantaggio : richiede un'annotazione personalizzata non standard che potrebbe creare confusione.
Quale idea considereresti la migliore pratica? C'è un altro approccio che mi manca totalmente in questo momento?