RowFilter

Diskutiere RowFilter im Java Basics - Anfänger-Themen Bereich.
O

OliW

Guten Abend,

mal eine Grundlagenfrage. Ich lerne jetzt schon fast ein Jahr und folgendes fällt mir erst heute auf.

Code:
 RowFilter rf = null;     
         rf = RowFilter.regexFilter(fldDatensuche.getText().trim());
Weshalb funktioniert sowas.
Ich erzeuge keine Instanz von RowFilter durch den new-Operator und trotzdem kann ich mit der Referenz rf arbeiten und kann sie dann beispielsweise
als Attribut in einen RowSorter einsetzen.

Und dann gleich eine zweite Frage. RowFilter ist doch eine abstrakte Klasse.
Weshalb geht dann sowas hier? Von abstrakten Klassen kann man doch eben keine Instanzen erstellen.


Code:
RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>()
Dank euch für Klärung
 
M

Meniskusschaden

Weshalb geht dann sowas hier? Von abstrakten Klassen kann man doch eben keine Instanzen erstellen.
Java:
RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>()
Das dürfte nicht funktionieren. Oder hast du ein kompilierbares Beispiel dazu?
 
mihe7

mihe7

Von abstrakten Klassen kann man doch eben keine Instanzen erstellen.
Aber von anonymen :)

Java:
RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>()
{
    public boolean include(RowFilter.Entry<? extends M,? extends I> entry) {
        return true;
    }
};
 
O

OliW

Das dürfte nicht funktionieren. Oder hast du ein kompilierbares Beispiel dazu?
Danke. Das habe ich hier gefunden.

Code:
 public JTableFilterDemo() {
        modifyDateInTable();
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        RowFilter<Object, Number> filter = new RowFilter<Object, Number>() {
            @Override
            public boolean include(RowFilter.Entry entry) {
 
O

OliW

regexFilter() ist eine statische Methode der Klasse RowFilter, in der mit new RegExFilter() eine RowFilter-Instanz erzeugt und zurückgegeben wird.
Ok. Danke. Die Instanz wird in der statischen Methode erstellt. Habe ein wenig Schwierigkeiten die API richtig zu lesen. Da hätte mir das auffallen können.
 
O

OliW

Aber von anonymen :)

Java:
RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>()
{
    public boolean include(RowFilter.Entry<? extends M,? extends I> entry) {
        return true;
    }
};
OK. Das ist genug Input um mir morgen den Kopf darüber zu zerbrechen. Sonst bekomme ich Alpträume :cool:.
 
mihe7

mihe7

Sonst bekomme ich Alpträume :cool:.
So schlimm ist es auch wieder nicht :)

Wenn Du eine benannte Klasse erzeugen würdest, sähe das so aus:
Java:
class MyRowFilter extends RowFilter<TableModel, Integer> {
    public boolean include(RowFilter.Entry<? extends M,? extends I> entry) {
        return true;
    }
}
Und dann würdest Du schreiben:
Java:
RowFilter<TableModel, Integer> filter = new MyRowFilter();
Es wäre nun aber ziemlich unschön, wenn man eine Klasse in der Form schreiben müsste, diese aber nur an einer einzigen Stelle Verwendung findet. Stattdessen kann man eine anonyme Klasse (anonymous inner class) on-the-fly von einer anderen ableiten, so wie oben gezeigt. Das funktioniert nicht nur mit abstrakten Klassen sondern auch mit nicht-abstrakten Klassen und insbesondere Interfaces:
Java:
Runnable r = new Runnable() {
    public void run() {
        System.out.println("Hello from a thread");
    }
};
Hier wird eine Instanz einer anonyme Klassen, die das Runnable-Interface implementiert, erzeugt.

Damit hier kein falscher Eindruck entsteht: man muss die Instanz nicht erst in einer Variablen zwischenspeichern, sondern man kann sie direkt z. B. als Argument beim Aufruf von Methoden verwenden. Zum Beispiel verlangt der Konstruktor von Thread ein Runnable:
Java:
new Thread(new Runnable() {
    public void run() {
        System.out.println("Hello from a thread");
    }
}).start();
Wenn das Interface nur eine einzige Methode besitzt, dann handelt es sich um eine sog. funktionale Schnittstelle. In dem Fall kann man Lambdas (anonyme Funktionen) verwenden, das führt aber an der Stelle zu weit.

Interessant sind anonyme Klassen auch für die Implementierung von Spezialfällen (vgl. Entwurfsmuster Null Object bzw. Special Case).
 
O

OliW

So schlimm ist es auch wieder nicht :)

Wenn Du eine benannte Klasse erzeugen würdest, sähe das so aus:
Java:
class MyRowFilter extends RowFilter<TableModel, Integer> {
    public boolean include(RowFilter.Entry<? extends M,? extends I> entry) {
        return true;
    }
}
Und dann würdest Du schreiben:
Java:
RowFilter<TableModel, Integer> filter = new MyRowFilter();
Es wäre nun aber ziemlich unschön, wenn man eine Klasse in der Form schreiben müsste, diese aber nur an einer einzigen Stelle Verwendung findet. Stattdessen kann man eine anonyme Klasse (anonymous inner class) on-the-fly von einer anderen ableiten, so wie oben gezeigt. Das funktioniert nicht nur mit abstrakten Klassen sondern auch mit nicht-abstrakten Klassen und insbesondere Interfaces:
Java:
Runnable r = new Runnable() {
    public void run() {
        System.out.println("Hello from a thread");
    }
};
Hier wird eine Instanz einer anonyme Klassen, die das Runnable-Interface implementiert, erzeugt.

Damit hier kein falscher Eindruck entsteht: man muss die Instanz nicht erst in einer Variablen zwischenspeichern, sondern man kann sie direkt z. B. als Argument beim Aufruf von Methoden verwenden. Zum Beispiel verlangt der Konstruktor von Thread ein Runnable:
Java:
new Thread(new Runnable() {
    public void run() {
        System.out.println("Hello from a thread");
    }
}).start();
Wenn das Interface nur eine einzige Methode besitzt, dann handelt es sich um eine sog. funktionale Schnittstelle. In dem Fall kann man Lambdas (anonyme Funktionen) verwenden, das führt aber an der Stelle zu weit.

Interessant sind anonyme Klassen auch für die Implementierung von Spezialfällen (vgl. Entwurfsmuster Null Object bzw. Special Case).
Es hat jetzt echt ne Weile gedauert bis ich das verstanden habe.
Wenn ich das richtig verstanden habe, verwende ich anonyme Klassen immer dann, wenn ich quasi nur einmal eine Instanz davon genau an der Stelle an der ich mich im Code befinde benötige.
Hab das jetzt mal mit einem Action Listener ausprobiert. o_O
Wäre mir das vorher klar gewesen, hätte ich in meinem Code nicht für jeden Button eine eigene Action Listener Klasse schreiben müssen (Habe 12 davon)
Wobei. Viel mehr arbeit ist das auch nicht aber klar, so ist es übersichtlicher.

Danke man. Wieder nen Hirnknoten gelöst.
 
mihe7

mihe7

Wenn ich das richtig verstanden habe, verwende ich anonyme Klassen immer dann, wenn ich quasi nur einmal eine Instanz davon genau an der Stelle an der ich mich im Code befinde benötige.
So könnte man es sagen :)

Hab das jetzt mal mit einem Action Listener ausprobiert. o_O
Wäre mir das vorher klar gewesen, hätte ich in meinem Code nicht für jeden Button eine eigene Action Listener Klasse schreiben müssen (Habe 12 davon)
OK, dann will ich Dir mit Lambdas mal die Tränen in die Augen treiben :p
Java:
button.addActionListener(e -> System.out.println("Clicked"));
ist die Kurzform für
Java:
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Clicked");
    }
});
 
O

OliW

So könnte man es sagen :)



OK, dann will ich Dir mit Lambdas mal die Tränen in die Augen treiben :p
Java:
button.addActionListener(e -> System.out.println("Clicked"));
ist die Kurzform für
Java:
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Clicked");
    }
});
In Lamdas muß ich mich später erst noch einlesen. Kämpfe noch mit den Basics, aber ich gewinne immer öfter.

Danke für Deine Hilfe. :cool:
 
Thema: 

RowFilter

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben