Avatar billede molluq Nybegynder
14. februar 2004 - 01:19 Der er 1 kommentar og
1 løsning

Swing: Instansierer komponenter før eller i konstruktøren?

Hejsa
Dette er måske mere en undren, end et komplekst spørgmål...
Jeg er ved at sætte mig ind i Swing (jæh!) og de bøger jeg bruger, er meget forskellige i deres måde at opskrive klasser.
Måske er det gældende for alle typer af klasser, ikke kun swing, men det er her jeg er faldet over "problemet"...

Her er et simpel eksempl;
//
import javax.swing.*;

public class testFrame extends JFrame{

    JButton login = new JButton("Login");
    JButton clear = new JButton("Clear");
    JTextField brugernavn = new JTextField(15);
    JPasswordField password = new JPasswordField(15);
    JLabel passEtiket = new JLabel("Password: ");
    JLabel brugerEtiket = new JLabel("Brugernavn: ");
   
    public testFrame(){
        super("Test af Frames");
        setSize(300, 180);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
               
        JPanel panel = new JPanel();
        panel.add(brugerEtiket);
        panel.add(brugernavn);
        panel.add(passEtiket);
        panel.add(password);       
        panel.add(login);
        panel.add(clear);
                   
        setContentPane(panel);
    }
   
    public static void main(String[] args){
        testFrame tF = new testFrame();
        tF.show();
    }
}

I eksemplet instansieres komponenterne buttons og labels, før (eller udenfor) konstruktøren - men i andre ekspempler flyttes det ind i selve konstruktøren. Er det ene mere "korrekt" end det andet?
I eksemplet nedarver testFrame constructor-metoden direkte fra JFrame klassen. Igen; hvilken forskel ville det gøre, hvis man droppede "extends JFrame" og istedet brugte "JFrame testFrame = new JFrame();" i konstruktøren? Den impoterer jo JFrame-klassen fra javax.swing.* alligevel

Håber der er nogen der kan give mig en ide om hvad der vil være god javakode-etik, eller hvad man skal kalde det.
Hvis den en form er mere rigtig en den anden, vil jeg hvertfald gerne have det på plads fra starten :)
Avatar billede arne_v Ekspert
14. februar 2004 - 10:06 #1
Det gælder for alle typer klasser.

Det betyder ikke noget om du initialiserer instans variable med = eller
assigner til dem i constructoren.

Eneste forskel er at i constrcutoren har du mere kontrol over rækkefølgen og kan
også udføre andre linier.

Primært smag og behag.

I komplekse tilfælde hvor man skal bruge information som skal hentes på runtime er
man nødt til at assigne i constructor.

Det er et klassisk valg om man vil extende eller encapsulate. I Swing extender
man traditionelt. Det bør også virke at encapsulate. Men jeg ville nok
vælge at følge "best practice" altså extende selvom jeg ikek finder det helt
indlysende hvorfor det er bedst. Mne om ikke andet så vil andre Java
programmører finde koden nemmere at læse.
Avatar billede molluq Nybegynder
14. februar 2004 - 10:59 #2
Tak for et godt svar.
Nu jeg selv har haft hele natten til selv at tænke over det, fandt jeg frem til at det  self også må have noget med scope at gøre - måske ikke så meget med swing komponenter, men tit i andre klasser.
Jeg er glad for at extends er "best-practice" - syntes det gør konstruktøren lidt mere overskuelig :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester