# "Untermethoden" - Methoden in einer Methode



## joschu (27. Apr 2010)

Hallo,

ich versuche mich gerade in einem großen Projekt zurechtzufinden. Dort gibt es folgendes Konstrukt:


```
public class Klasse{
...
     protected void funktion1(){
     ...
          private Objekt1 funktion2(...){
          ...
          }

          public Boolean funktion3(...){
          ...
          }
     ...
     }
...
}
```

Ich kenne Klassen in Klassen aber Methoden in Methoden habe ich noch nie gesehen. Wie sieht die Ausführung aus? Gibts dafür einen speziellen Namen? Oder hab ich irgendwas übersehen und das gibts eigentlich doch gar nicht.

Gruß


----------



## bygones (27. Apr 2010)

methoden in methoden gibt es nicht und wird auch nicht kompilieren.

Sicher dass darum nicht eine anonyme Klasse gepackt ist ?


----------



## joschu (27. Apr 2010)

Danke, das wars.
Irgendwo in der schlechten Formatierung und den unübersichtlichen Bezeichnern habe ich die anonyme Klasse gefunden.
Fürs nächste Mal weiß ich Bescheid.


----------



## Gastredner (27. Apr 2010)

Nutzt du Eclipse? Dank Auto-Formatierung mit Strg+Shift+F ist schlechte Formatierung glücklicherweise kein allzu großes Problem mehr...


----------



## André Uhres (27. Apr 2010)

bygones hat gesagt.:


> Sicher dass darum nicht eine anonyme Klasse gepackt ist ?


Die Klasse muss aber nicht anonym sein .


----------



## Noctarius (27. Apr 2010)

Aber Klassen innerhalb von Methoden geht wie André unterschwellig angemerkt hat 


```
public class ClassTest {
	public static void main(String[] args) {
		class Foo {
			void foo() {
				System.out.println("Foo!!!");
			}
		}
		
		Foo foo = new Foo();
		foo.foo();
	}
}
```


----------



## André Uhres (29. Apr 2010)

Noctarius hat gesagt.:


> Aber Klassen innerhalb von Methoden geht wie André unterschwellig angemerkt hat


Das war aber nicht unterschwellig sondern eher offenkundig: eine anonyme Klasse ist ja auch eine Klasse.


----------



## bygones (29. Apr 2010)

André Uhres hat gesagt.:


> Die Klasse muss aber nicht anonym sein .



wollte ich auch nicht behaupten... nur in geschätzten 99% der Fälle ist es einen anonyme Implementierung...


----------



## Noctarius (29. Apr 2010)

bygones hat gesagt.:


> wollte ich auch nicht behaupten... nur in geschätzten 99% der Fälle ist es einen anonyme Implementierung...



Ich würde fast schätzen in 99,9% aller Fälle  Hab noch nie Sourcecode gesehen wo etwas wie im obigen Beispiel echt Verwendung gefunden hat *g*


----------



## André Uhres (30. Apr 2010)

Noctarius hat gesagt.:


> Hab noch nie Sourcecode gesehen wo etwas wie im obigen Beispiel echt Verwendung gefunden hat


Dann wird's so langsam Zeit, dich mal ein wenig umzuschauen  Quick Search für JTable - Byte-Welt Wiki


----------



## Ebenius (30. Apr 2010)

Noctarius hat gesagt.:


> Ich würde fast schätzen in 99,9% aller Fälle  Hab noch nie Sourcecode gesehen wo etwas wie im obigen Beispiel echt Verwendung gefunden hat *g*


Ich mach das auch ab und an. Wenn ich zwei Instanzen des Listeners/Handlers brauche, oder -- den Fall gibts öfter mal -- einen Listener der eigentlich klein ist aber zwei Interfaces implementieren muss. Das geht anonym ja nicht.

Ebenius


----------



## André Uhres (30. Apr 2010)

bygones hat gesagt.:


> in geschätzten 99% der Fälle ist es einen anonyme Implementierung...


In der Problemstellung "Methode innerhalb Methode" aber oft wenig sinnvoll. Ich kann ja eine Methode, die ich innerhalb einer anonymen Klasse definiere, nicht ausserhalb derselben ansprechen .


----------



## Ebenius (30. Apr 2010)

André Uhres hat gesagt.:


> Ich kann ja eine Methode, die ich innerhalb einer anonymen Klasse definiere, nicht ausserhalb derselben ansprechen .


Wenn Du's so ausdrückst, ist's falsch. Ich kann das...

```
Runnable foo() {
  return new Runnable() {
    public void run() {
      //
    }
  };
}

void bar() {
  foo().run();
}
```
Ebenius


----------



## André Uhres (30. Apr 2010)

Ebenius hat gesagt.:


> Wenn Du's so ausdrückst, ist's falsch. Ich kann das...
> 
> ```
> Runnable foo() {
> ...


Das Beispiel verstehe ich nicht. Du hast überhaupt keine Methode definiert (lediglich "run" implementiert). In meinem obigen Link zum "Quick Search" findest du ein Beispiel.


----------



## Ebenius (30. Apr 2010)

André Uhres hat gesagt.:


> Das Beispiel verstehe ich nicht. Du hast überhaupt keine Methode definiert (lediglich "run" implementiert). In meinem obigen Link zum "Quick Search" findest du ein Beispiel.


Was Du gemeint hattest war mir schon klar. Aber Du hast es falsch ausgedrückt. Das Interface [c]Runnable[/c] *deklariert* eine Methode [c]run()[/c]. Die in [c]foo()[/c] erzeugte Klasse (ob nun anonym oder nicht spielt keine Rolle) *definiert* eine Methode [c]run()[/c]. Auf die in 
	
	
	
	





```
Runnable
```
 deklarierte aber in der anderen Klasse definierte Methode kann man von außen also über das Interface zugreifen.

Siehe dazu den Wikipedia-Artikel zu "Deklaration (Programmierung):


			
				wikipedia::Deklaration (Programmierung) hat gesagt.:
			
		

> Häufig werden die Begriffe Deklaration und Definition gleichgesetzt. Die Definition ist allerdings ein Sonderfall der Deklaration. Bei Variablen spricht man von Definition, wenn der Compiler Code erzeugt, der entweder statisch (im Datensegment) oder dynamisch (zur Laufzeit) Speicherplatz für diese Variable reserviert. *Bei Unterprogrammen spricht man von Definition, wenn an dieser Stelle der Quelltext des Unterprogramms angegeben ist, der vom Compiler übersetzt wird.* Die Deklaration eines Unterprogramms ohne Definition wird auch oft als Prototyp bezeichnet.



Nix für ungut. 
Ebenius


----------



## André Uhres (30. Apr 2010)

Da der Gedanke klar ist, versteh ich nicht, wieso du meine Ausdrucksweise bemängelst ???:L (mit Wikipedia könnte ich auch meine Ausdrucksweise belegen).


----------



## Ebenius (30. Apr 2010)

Fand halt die Ausdrucksweise uneindeutig und wollte drauf hinweisen. Never mind. 

Ebenius


----------



## André Uhres (30. Apr 2010)

Hauptsache sie ist korrekt, das andere ist halt Ansichtssache.


----------

