Allora ho creato una interfaccia
estendo i miei JInternalFrame con questa interfaccia....codice:public interface DataSaver { void save(); }
Quando faccio l'ovveraide del metodo nell'internal frame passo i valori del form?
Allora ho creato una interfaccia
estendo i miei JInternalFrame con questa interfaccia....codice:public interface DataSaver { void save(); }
Quando faccio l'ovveraide del metodo nell'internal frame passo i valori del form?
No, secondo quanto ho detto prima, non sono gli internal frame che implementano DataSaver !! E comunque, sempre come ho detto, è (quasi) sicuramente più utile che DataSaver sia una classe "astratta".
Ok, rifaccio l'esempio con le persone:
Questa di seguito è la "base", che è generale:
codice:public abstract class DataSaver { public void save() throws SQLException { // MOLTO abbozzato! // ... ottiene la Connection ... // ... eventuali setup su Connection ... executeSave(connection); // ... commit o rollback, chiusura connection ... // ... eventuale log, ecc... } protected abstract void executeSave(Connection conn) throws SQLException; } public abstract class InternalFrameBase extends JInternalFrame { // costruttore/i (se necessari) // .... public abstract DataSaver getDataSaver(); }
Queste di seguito sono le implementazioni per la gestione di una "persona":
L'ho scritto al volo, non testato ovviamente e molto abbozzato. Devi completare tu ma soprattutto comprendere il "design" in generale.codice:public class InternalFramePersona extends InternalFrameBase { // ... campi componenti gui ... // ......costruttore/i, altro, ecc.... public DataSaver getDataSaver() { DataSaverPersona saver = new DataSaverPersona(); saver.setNome(nomeTextField.getText()); saver.setCognome(cognomeTextField.getText()); return saver; } } public class DataSaverPersona extends DataSaver { // campi nome e cognome // .... costruttore/i (può anche non esserci se si usano i setter). public void setNome(String nome) { ...... } public void setCognome(String cognome) { ...... } publid String getNome() { .... } publid String getCognome() { .... } protected void executeSave(Connection conn) throws SQLException { PreparedStatement pstmt = conn.prepareStatement("insert into blabla......"); try { pstmt.setString(1, getNome()); pstmt.setString(2, getCognome()); pstmt.executeUpdate(); } finally { pstmt.close(); } } }
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
questa è una inner class di InternalFramePersona?codice:public class DataSaverPersona extends DataSaver { // campi nome e cognome // .... costruttore/i (può anche non esserci se si usano i setter). public void setNome(String nome) { ...... } public void setCognome(String cognome) { ...... } publid String getNome() { .... } publid String getCognome() { .... } protected void executeSave(Connection conn) throws SQLException { PreparedStatement pstmt = conn.prepareStatement("insert into blabla......"); try { pstmt.setString(1, getNome()); pstmt.setString(2, getCognome()); pstmt.executeUpdate(); } finally { pstmt.close(); } } }
Nel mio esempio che ho fatto, no, non lo è (se lo avessi fatto, avrei messo DataSaverPersona prima della } di chiusura di InternalFramePersona).
Ho pensato semplicemente che DataSaverPersona potrebbe, tecnicamente, essere utilizzata anche in altri contesti. Dopotutto è solamente una classe con delle proprietà nome/cognome e con un metodo save() (ereditato) che sa come fare il salvataggio in modo specifico attraverso l'override di executeSave.
Quindi nulla vieterebbe di usarla altrove nel programma. Se a te non interessa il riuso, come vedi l'unico punto in cui è istanziata nel mio esempio è nel getDataSaver() di InternalFramePersona e soprattutto, restituita come il tipo più astratto che è DataSaver.
Qui quello che conta è il polimorfismo. All'esterno di InternalFramePersona importa solo "vedere" un oggetto come DataSaver (il tipo più generico) e sapere che ha un save(). Non importa sapere se la classe concreta si chiama PincoPalla, è dentro o fuori InternalFramePersona o nel package xyz.
Tecnicamente puoi anche farla come inner (o nested) class di InternalFramePersona, anche "privata" e non visibile all'esterno. Dovessi fare il tutto io, le terrei separate ma per un motivo molto semplice: InternalFramePersona si occupa della interfaccia grafica, mentre DataSaverPersona non ha nulla a che fare direttamente con l'interfaccia grafica (anzi, solo con JDBC), quindi non metterei tutto insieme.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet