Sto attualmente cercando di creare un'API per un framework UI, per una nuova applicazione. Questo framework UI è implementato internamente usando un framework esistente, diciamo JavaFX. Voglio nascondere i dettagli dell'implementazione all'utente (lo sviluppatore che utilizza l'API), quindi ad esempio, quando l'utente indirizza un'immagine, voglio che lui / lei usi la mia interfaccia, chiamiamola ImageResource
. In questo modo le specifiche di JavaFX non sono esposte all'utente, e mi rimane la libertà di modificare il framework dell'interfaccia utente nella mia implementazione in un momento successivo, o semplicemente di creare una nuova implementazione dell'API in cui viene utilizzato un framework diverso .
L'utente dovrebbe caricare una risorsa immagine tramite un caricatore di risorse, che fa parte dell'API. La risorsa caricata potrebbe quindi essere passata a diverse funzioni o contenitori, che quindi lavorerebbero sull'immagine, sia visualizzandola o elaborandola.
// Load a resource using a resource id, which would probably be a file name or url.
ImageResource resource = resourceLoader.loadImage("some/image/id");
// Add the image to some container, which would then have the image displayed. The container
// is also of an API interface type.
someContainer.addImageResource(resource);
Il problema è che l'utente gestisce le istanze ImageResource
e le passa ad altre funzioni API che dovrebbero quindi visualizzare l'immagine o in qualsiasi altro modo lavorare con l'immagine. Quindi internamente il framework dovrebbe prendere un'istanza di ImageResource
e fare qualcosa di significativo con l'immagine. Dal momento che non voglio esporre il javafx.scene.image.Image
attraverso l'interfaccia e non voglio fare un controllo instanceof
. Trovo che il controllo instanceof
sia brutto e davvero distruttivo per l'intero pensiero di dividere l'API in interfacce più piccole.
Ma come faccio a estrarre l'immagine interna dall'interfaccia, finora ho considerato:
- Aggiunta di un metodo all'interfaccia che restituisce un'istanza di
javafx.scene.image.Image
, che mi fornisce tutto ciò di cui avevo bisogno, ma al costo di bloccare l'API per le specifiche di JavaFX, che speravo davvero di evitare. - Lasciando il
ImageResource
in possesso di una chiave, ad esempio un identificatore di stringa di un'immagine, e quindi in qualche classe di modello interno cenral, avere una mappa che ha tradotto l'id della stringa in un'immagine. Questo potrebbe potenzialmente essere usato per aggiungere un po ', possibilità di liberare memoria dalle immagini usate di rado. Allo stesso tempo, però, renderebbe complicata la pulizia della mappa. Quando unImageResource
viene raccolto dal garbage collector, perderebbe un riferimento all'immagine JavaFX se lo mantenesse internamente, ma come potrei sapere quando rilasciare se dalla mappa, se l'immagine era posizionata centralmente? Usare metodirelease
manuali sarebbe solo una fonte di perdite.
Non sono sicuro che esista anche una buona soluzione a questo, in questo momento sto considerando semplicemente di andare con il primo approccio ed esporre le classi JavaFX dalle interfacce, ma mi piacerebbe molto tenere fuori queste specifiche di implementazione dell'API. C'è qualche schema o pensiero generale che potrebbe essere utile per risolvere questo?