static und Pattern matching

  • Themenstarter Themenstarter Gelöschtes Mitglied 17508
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 17508

Gast
Hallo Forum!

Ich habe folgendes Verständnisproblem.
Die Klasse Pattern ist final, kann somit nicht abgeleitet werden, das ist mehr als nur einleuchtend.
Jetzt ist es aber so, dass manche Methoden der Klasse Pattern static sind, es können somit mit new keine Objekte dessen angelegt werden, auch einleuchtend für mich.

Aber es gibt nun wiederum Methoden der Klasse, die nicht static sind, wie zB: flags().

Jetzt hingegen müsste ich doch vorher mit Pattern p = new Pattern(); ein Object anlegen können/müssen und dann mittels p.flags() weiterarbeiten.

Jedoch erscheint mir hier immer die Fehlermeldung: The constructor Pattern ist undefined!

Ist mir klar, weil die Pattern Klasse keinen Konstruktor mit sich führt!

Aber nachdem die Methode flags nun nicht static ist, wieso muss ich dann trotzdem kein Object erzeugen, sondern kann ganz einfach mittels

Code:
Pattern p;
int zahl = p.flags() verwenden?

ich dachte mir, um ein langlebieges Object zu erzeugen, gehe ich so vor

Pattern p = new Pattern();
int zahl = p.flags();

Wenn mir jemand genau erklären könnte, warum ich hier nicht über ein Object gehen kann!
Bin etwas verwirrt!

Danke Euch schon vielmals im vorhinein!
 
also ohne Objekt sollte die Methode ja nicht aufrufbar sein.

du musst dann eben zB. per Compile ein Objekt der Klasse erhalten und kannst dann dessen objektspezifische Methoden aufrufen.
 
Pattern erzeugt man normalerweise so:

Java:
Pattern pattern = Pattern.compile(regularExpression, flags);
 
Folgendes ist mir ja klar:

Code:
Pattern p = p.compile....

weil die Methode compile einen Pattern zurückgibt und statisch ist.
Aber die Methode flags ist ja nicht statisch, wieso kann ich dann aber nicht ein Object Pattern erzeugen.
Das wird mir im Moment nicht klar.
 
Folgendes ist mir ja klar:

Code:
Pattern p = p.compile....

weil die Methode compile einen Pattern zurückgibt und statisch ist.
Aber die Methode flags ist ja nicht statisch, wieso kann ich dann aber nicht ein Object Pattern erzeugen.
Das wird mir im Moment nicht klar.

Ich verstehe deine Frage nicht, aber der Code ist falsch. wie ich oben schrieb, heißt es [c]Pattern.compile(...)[/c]. Und die Flags kannst du beim Kompilieren angeben. Wie oben schon geschrieben.
 
Hm, vll kann ich es so besser erklären, was ich meine.

Von der Klasse System gibt es nur statische Methode, daher ist nur folgendes möglich

Java:
System.exit
System.out.println
etc

Ein Objekt zu erzeugen ist hier ja nicht möglich!

Die Klasse Pattern hingegen hat statische wie nicht statische Methoden.
Eine dieser Methoden ist flags().

Daher müsste ich ja schreiben:

Java:
Pattern p = new Pattern();
int zahl = p.flags();

Ich hoffe, dass ich es jetzt besser erklären konnte!
 
das
Java:
new Pattern();
wird eh aufgerufen. nur nicht von dir. das passiet irgendwo in der statischen compile methode. der konstruktor ist private, daher kannst du von außen kein eigenes Pattern objekt erzeugen. schau dir einfach den source code der klasse Pattern an. vielleicht ist dir dann klarer wie sie funktioniert.
 
Ok, dass der Konstruktor private ist, akzeptiere ich so.
Wo kann ich aber aus der Seite auslesen, dass der Konstruktor private ist bzw. damit ich genau weiss, dass die Methode flags() eben nicht auf meine Weise zu behandeln ist?

Pattern (Java 2 Platform SE v1.4.2)

Dann wäre für mich eigentlich alles beantwortet!

Danke Euch vielmals!
 
1. [c]flags()[/c] ist nicht als static deklariert in der API
2. Du findest keine Konstruktoren in der API, also sind keine sichtbar

Aber was es mit der Frage mit den Flags auf sich hat, weiss ich auch nicht. [c]flags()[/c] liefert lediglich die Flags zurück, die du bei [c]compile()[/c] angegeben hast.
 
da auf der seite kein Konstruktor aufgeführt ist, hast du keinen den du nutzen kannst .. selbst der standardkonstruktor wäre da angegeben.

Ein Pattern scheint ja ein Objekt zu sein, was nicht mit der Zeit manipuliert wird sondern in einem gewissen Zustand erzeugt wird und in diesem bleibt .. folglich wäre es nicht sinnvoll leere Pattern-Objekte zu erzeugen und irgendwelche Methoden abzufragen. Es gibt ja keine Setter in dem Sinne .. jede "Änderung" bedarf einer Erzeugung eines neuen Objektes.
 
Zuletzt bearbeitet:
ad diggaa1984:

Danke Dir, Deine Erklärung war mir schon sehr hilfreich.
Ganz besonders das mit den getter und setter war mir hilfreich in dem Fall.

Folgendes kann ich ja vermutlich machen, obwohl es nichts bringen wird und eine NullPointerException auslöst!

Java:
Pattern p = null;
int zahl = p.flags();

Mir ging es letzten Endes nur darum, die einzelnen Unterschiede auf einen Blick herauslesen zu können und bei der Pattern Klasse bin ich gehangen, weil es Methoden gibt, die statisch sind und andere nicht.
Jetzt wollte ich einmal mit der flags - Methode herumhantieren, aber ständig wird nur von Pattern p = p.compile gesprochen!
 
kannste mache klar, aber bringt eben die NPE 🙂 ... weil hier stehts ja dann bordeaux auf blaugrau das
Code:
p == null
ist 🙂
 
Genau, danke Dir vielmals!

Dachte mir die ganze Zeit, dass ein

Java:
Pattern p = null;
int zahl = p.flags();

nicht möglich wäre, weil immer nur von

Java:
Pattern p = p.compile

gesprochen wurde, was mir hier aber nicht weiterhalf 🙂

Aber jetzt weiss ich zumindest, dass es geht, jedoch ohne Zweck und es trotzdem kompilierbar ist!
Das war mir wichtig!

Danke Dir/Euch vielmals und für meine blöde Frage!
 
Jetzt wollte ich einmal mit der flags - Methode herumhantieren, aber ständig wird nur von Pattern p = p.compile gesprochen!

... p.compile ist immer noch falsch ...

anscheinend missverstehen wir uns einfach. Hier mal ein Beispiel:

[Java]package regularExpressions;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FlagsAusgeben {


public static void main(String[] args) {
int flags = Pattern.CASE_INSENSITIVE | Pattern.MULTILINE;
String regexp = "a.*b";
Pattern pattern = Pattern.compile(regexp, flags);

String input = "AAAAAAAAAAAAAAAAdfooAAAAbBbB";
Matcher matcher = pattern.matcher(input);
if (matcher.matches()) {
System.out.println("Treffer!");
System.out.println("Text: [" + input + "]");
System.out.println("flags in: [" + flags + "]");
int flagsOut = pattern.flags();
System.out.println("flags out: [" + flagsOut + "]");
}
else {
System.out.println("Kein Treffer!");
}
}

}
[/code]

Ausgabe:

Code:
Treffer!
Text: [AAAAAAAAAAAAAAAAdfooAAAAbBbB]
flags in: [10]
flags out: [10]

Vielleicht erhellt das das ganze etwas?
 
Danke Dir, hat mir auch geholfen!

Mir ging es ja darum zu verstehen, warum ich nicht einfach hergehen kann und ein Pattern Object bilden kann und dann gleich auf dieses Object die Methode flags anwenden kann!

Aber das liegt daran, dass es einen private Konstruktor gibt und so einer kann nicht instanziiert werden!
Leider stand auf der Java Seite vom Pattern nichts davon, dass der Konstruktor private ist und beim ersten Male habe ich im Source Code von Pattern auch diesbezüglich nichts gefunden ( falsch gesucht! ).

Danke Euch allen vielmals!
 
Mir ging es ja darum zu verstehen, warum ich nicht einfach hergehen kann und ein Pattern Object bilden kann und dann gleich auf dieses Object die Methode flags anwenden kann!

Hmm.

Java:
Pattern pattern = Pattern.compile(regexp, flags);

bildet dein Pattern Objekt und

Java:
int flagsOut = pattern.flags();

wendet die Methode flags an.

:bahnhof:
 
Noch eine ganz allgemeine Bemerkung, welche noch nicht gefallen ist: In der Java SE API ist eigentlich immer jede Klasse genaustens beschrieben. Da findest du zuoberst in Pattern (Java Platform SE 6) auch Beispiele:
A typical invocation sequence is thus
Java:
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
A matches method is defined by this class as a convenience for when a regular expression is used just once. This method compiles an expression and matches an input sequence against it in a single invocation. The statement
Java:
boolean b = Pattern.matches("a*b", "aaaaab");
is equivalent to the three statements above, though for repeated matches it is less efficient since it does not allow the compiled pattern to be reused.
Dort steht in diesem Fall auch detailliert, wie Regex in Java anzuwenden ist bzw. von dieser Klasse implementiert wurde.
 
add Crian :

Du hast schon recht, dass deine Vorgehensweise auch ein Patternobject bildet; mir ging es aber darum mit new ein Pattern Object zu bilden!

Java:
Pattern p = new Pattern();

Das geht aber nur ( hat ein wenig gedauert, bis ich es gefunden habe - sorry! ), wenn der Konstruktor nicht private ist! und genau hier lag dann mein Problem.
Im Java Text stand leider nichts vom private Konstruktor und nur Beispiele selber helfen mir nicht immer weiter. Ich will manchmal etwas anders machen als vorgegeben, nur um es besser verstehen zu können!
 
Im Java Text stand leider nichts vom private Konstruktor [...]
Ja, weil du diese sowieso nicht benutzen kannst.
[...] und nur Beispiele selber helfen mir nicht immer weiter. Ich will manchmal etwas anders machen als vorgegeben, nur um es besser verstehen zu können!
Aber Beispiele sind doch genau dazu da, zu verstehen, wie man das zu verwenden hat... Bei einem schönen Design sollte es nicht 3000 Wege geben, wie man etwas macht. Wieso willst du das also anders machen, als es gemacht werden muss?
 
Ich will ja nicht absichtlich etwas anders machen, aber ich hab mich einfach gewundert, warum ich kein neues Object mit new anlegen kann!
Und wie ich das dann eben ausprobierte hatte, hat es Probleme gegeben.
Abzuschreiben oder nur zu lesen, dass es so ist wie es ist, zeugt nicht gerade von Verständnis finde ich! - Ich habe mir in diesem Fall Gedanken gemacht, warum eben kein Obejct mit new angelegt werden kann!
 

Zurück
Oben