local variable model is accessed from within inner class; needs to be declared final

nieselfriem

Bekanntes Mitglied
Hallo!

In meinem Tabellenmodell soll bei einem Update dieses gleich mitprotokolliert werden und daraus gleich ein SQL Befehl erstellt werden. Dieser wird dann in eine Arraylist gepackt. Nun habe ich eine einfache get-Methode in das tabellenModel gepackt um die Liste auszulesen. Diese Liste soll nun per Button einfach zu testzwecken auf der Konsole ausgeben werden. Da gibt es die Schwierigkeiten
Tabellenmodell:
Java:
        TableModelEvent event = new TableModelEvent(
                this, rowIndex, rowIndex, columnIndex, TableModelEvent.UPDATE );
        for( TableModelListener listener : listeners )
            listener.tableChanged( event );
        if(event.getColumn()==0) {
        	System.out.println("Name");
        	System.out.println(bottle.getName());
        	sqlList.add("INSERT INTO `bottle` WHERE ID=1 `Name`="+bottle.getName());//
        }

        if(event.getColumn()==1) {
        	System.out.println("Grösse");
        	System.out.println(bottle.getSize());
        	sqlList.add("INSERT INTO `bottle` WHERE ID=1 `Brösse`="+bottle.getSize());
        }
    }

    public ArrayList getSqlList() {
    	return 	sqlList;
    }
Main:
Java:
public class JTableDemo  {
    public static void main( String[] args ){
        // Ein neues Model erzeugen
        BottleModel model = new BottleModel();

        // Das Model mit Daten füllen
        model.addBottle( new Bottle( "Whiskey",  3, true ));
        model.addBottle( new Bottle( "Mineral", 10, false ));
        model.addBottle( new Bottle( "Bier",     5, false ));
        model.addBottle( new Bottle( "Sirup",    7, true ));
        model.addBottle( new Bottle( "Kaffee",   1, true ));



        // Das JTable initialisieren
        JTable table = new JTable( model );
        JButton jsql = new JButton("SQL");
        jsql.addActionListener(new java.awt.event.ActionListener(){
        	public void actionPerformed(ActionEvent e) {
				for(int i = 0; i < model.getSqlList().size(); ++i) {//Fehler
   				 	System.out.println(model.getSqlList().get(i));
				}

        	}
        }
        );

        JFrame frame = new JFrame( "Demo" );
        frame.getContentPane().add( new JScrollPane( table ) );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible( true );
    }
}
In der Main kann ich nicht auf die Methode getSqlList() zugreifen. Das hat wohl etwas mit der inneren Klasse zu tun. Die Lösungsmöglichkeit fehlt mir aber.
Danke für den Hinweis.

Gruß
 
um von inner classes auf teile der äußeren klasse zugriefen zu koennen muss man diese als final deklarieren, sonst geht es nicht.

edit: außerdem ist pulbic protected auch nicht erlaubt.
 
Was ist eigentlich der Grund dafür? Besonders wenn man nur lesend auf (lokale) Primitive zugreift. Hat mir schon ein paarmal den Code verkompliziert, indem ich die anonyme Klasse als "richtige" Klasse implementieren musste.
 
an sich ist das schon nützlich, wenn der anonyme Code als Thread nebenher läuft und die Variable in der eigentlichen Methode noch verändert wird..,
ist die Variable ein Klassenattribut dann ist das aber genauso möglich..,
bestimmt eine Frage wo und wie der Wert außerhalb der Methode im Speicher abgelegt wird

selbst wenn das final bleiben müsste, wäre es schön wenn der Compiler das anders prüfen würde:
wenn er schon diesen Fehler feststellen kann, dann weiß er ja also, welche lokalen Variablen betroffen sind,
diese könnte er beim Kompilieren stillschweigend als final deklarieren, wenn dann alles klappt: super,
wenn nicht, weil die Variable in der Methode noch verändert wird, dann könnte die Fehlermeldung kommen 'final needed, cannot make final'
😉
 

Neue Themen


Zurück
Oben