Toon posts:

[Java] Warning bij static field...

Pagina: 1
Acties:

Verwijderd

Topicstarter
In één van m'n classen staat dit stukje code:
code:
1
2
3
4
int returnInt = libChooser.showOpenDialog(this);
            if(returnInt == libChooser.APPROVE_OPTION) {
                File f = libChooser.getSelectedFile();
                try { ...


Eclipse 3.0.1 klaagt hier over de regel met returnInt == libChooser.APPROVE_OPTION erin:

The static field JFileChooser.APPROVE_OPTION should be accessed in a static way

Wat wil dit zeggen ? Ik heb dit soort constructies al eerder gebruikt zonder zo'n warning te genereren. Tijdens het compileren komt die warning niet voor.

  • ronaldmathies
  • Registratie: Juni 2001
  • Niet online
Je moet een Static vanuit de klasse aanroepen en niet vanuit de variabele.

Dus bijvoorbeeld:

JFileChooser.APPROVE_OPTION

3015 Wp-z 5360 Wp-nno op 2 x SMA-SB3600 TL-21, Warmtepomp: ERSC-VM2CR2 / PUHZ-SHW140 YHA, WTW Q350, EV Kia Ev6 GT-Line


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15-05 08:48

Janoz

Moderator Devschuur®

!litemod

libChooser is waarschijnlijk een instantie van een class en APROVE_OPTION is vast een static variable.

Zoals de code daar staat roep je de static waarde op van een instantie. Dit hoor je te doen vanaf de class zelf. Ik weet niet hoe de class zelf heet, maar waarschijnlijk moet je libChooser vervangen door LibChooser.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-05 06:45
APPROVE_OPTION is gedeclareerd als 'static' variable van de JFileChooser klasse. 'static' betekent de variabele gekoppeld is aan de klasse en niet aan een specifieke instantie (object) van die klasse.

Eclipse klaagt omdat je aan een static variabele van een object refereert. Dat is in principe niet fout, maar je moet je realiseren dat dan het statische type van het object gebruikt wordt. Dat kan fout gaan in bijvoorbeeld een situatie als deze:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Base {
    public final static int STATIC_VARIABLE = 123;
};
class Derived extends Base {
    public final static int STATIC_VARIABLE = 456;
};

// ... 
{
    Derived d = new Derived();
    System.out.println(d.STATIC_VARIABLE); // prints 456

    Base b = new Derived();
    System.out.println(b.STATIC_VARIABLE); // prints 123
}

Het verdachte hier is dat ookal is 'b' van type Derived, toch krijg je de variable van Base omdat het een static variabele is.

Als je in plaats van een variabele (d of b) direct de klasse had gebruikt, was direct duidelijk geweest dat het om een static variabele gaat en daarmee voorkom je dus verwarring bij de lezer van de code. Dat is ook precies wat Eclipse (terecht) aanraadt. Overloaden van statische velden kan ook niet echt (ook al doet de code wat anders vermoeden) juist doordat altijd het statische type gebruikt wordt en niet het dynamische ('werkelijke') type van het object waarmee je bezig bent.

Verwijderd

Topicstarter
'k heb nu deze regel toegevoegd aan mijn class:
static int approve = JFileChooser.APPROVE_OPTION;
en
returnInt == libChooser.APPROVE_OPTION Is nu in orde ^^

Bedankt voor jullie hulp. Dit had ik niet gevonden met google :s

[ Voor 3% gewijzigd door Verwijderd op 31-01-2005 17:19 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-05 06:45
Janoz schreef op maandag 31 januari 2005 @ 17:07:
libChooser is waarschijnlijk een instantie van een class en APROVE_OPTION is vast een static variable.
De waarschuwing van Eclipse is heel duiderlijk: libChooser.APROVE_OPTION is gelijk aan JFileChooser.APROVE_OPTION en daaruit blijkt dus dat de klasse van LibChooser geen APROVE_OPTION variabele heeft. Je moet dus echt JFileChooser.APROVE_OPTION gebruiken.

Verwijderd

Topicstarter
Soultaker schreef op maandag 31 januari 2005 @ 17:18:
[...]

De waarschuwing van Eclipse is heel duiderlijk: libChooser.APROVE_OPTION is gelijk aan JFileChooser.APROVE_OPTION en daaruit blijkt dus dat de klasse van LibChooser geen APROVE_OPTION variabele heeft. Je moet dus echt JFileChooser.APROVE_OPTION gebruiken.
JFileChooser.APROVE_OPTION gaf dezelfde error.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-05 06:45
Verwijderd schreef op maandag 31 januari 2005 @ 17:19:
JFileChooser.APROVE_OPTION gaf dezelfde error.
Ik geloof er niets van. :P Je hebt me niet genoeg code gegeven om mee te testen, maar het lijkt me heel sterk.

Verwijderd

Topicstarter
Hier is de source code van de ganse class.
Maar je hebt inderdaad gelijk. Na Eclipse te hebben afgesloten en terug te openen was die error verdwenen. Na het saven & builden van voorheen, bleef dat warning icoontje staan.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.io.IOException;

public class prefsUI extends JDialog implements ActionListener{
    
    Toolkit tk;
    
    JLabel loadLabel;
    JButton libButton;
    JFileChooser libChooser;
    
    public prefsUI(JFrame parent, langlib uselib, String title) {
        
        this.setTitle(title);
        this.getContentPane().setLayout(new FlowLayout());
        
        loadLabel = new JLabel("<html>Select the library you want to use<br>" +
                "for the matching process.</html>");
        this.getContentPane().add(loadLabel);
        
        libButton = new JButton("Load");
        libButton.addActionListener(this);
        //this.getContentPane().add(libButton, BorderLayout.CENTER);
        this.getContentPane().add(libButton);
        
        tk = Toolkit.getDefaultToolkit();
        
        this.pack();
        this.setLocation((int)tk.getScreenSize().getWidth() / 100 * 30 ,
                (int)tk.getScreenSize().getHeight() / 100 * 30 );
        this.setVisible(true);
        this.setResizable(false);
    }
    
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == libButton) {
            libChooser = new JFileChooser();
            libChooser.addChoosableFileFilter(new libFilter());
            int returnInt = libChooser.showOpenDialog(this);
            if(returnInt == JFileChooser.APPROVE_OPTION) {
                File f = libChooser.getSelectedFile();
                try {
                    // Read the entire file
                    FileInputStream fi = new FileInputStream(f.getPath());
                    BufferedReader br = new BufferedReader(new InputStreamReader(fi));
                    while(true) {
                        String row = br.readLine();
                        if(row == null) {
                            break;
                        } else {
                            System.out.println(row);
                        }
                    }
                    br.close();
                    JOptionPane.showMessageDialog(this, "Library loaded");
                    this.setVisible(false);
                    this.dispose();
                } catch(IOException ioe) {
                    JOptionPane.showMessageDialog(this, ioe.getMessage());                  
                }
            }
        }
    }
    
    class libFilter extends javax.swing.filechooser.FileFilter {
        public boolean accept(File file) {
            String filename = file.getName();
            return filename.endsWith(".lib");
        }
        public String getDescription() {
            return "Language Library (*.lib)";
        }
    }
}


Code is misschien een beetje slordig overkomen, but heck... 't is om te testen.

PS: wat is de tag voor java markup?

[ Voor 7% gewijzigd door Verwijderd op 31-01-2005 19:52 . Reden: Java markup ]


  • ronaldmathies
  • Registratie: Juni 2001
  • Niet online
In eclipse zit een optie in het menu project : clean. Deze schoont het project op (van alle gebuilde bestanden). En doet een complete build. Soms geeft dit uitkomst.

3015 Wp-z 5360 Wp-nno op 2 x SMA-SB3600 TL-21, Warmtepomp: ERSC-VM2CR2 / PUHZ-SHW140 YHA, WTW Q350, EV Kia Ev6 GT-Line


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-05 06:45
Verwijderd schreef op maandag 31 januari 2005 @ 17:29:
PS: wat is de tag voor java markup?

[code=java]
public class Foo {
// blablabla...
};
[/code]

Verwijderd

Topicstarter
Bedankt voor de tips & trucks :)
Pagina: 1