# Konzept: Innere Klasse, Anwendungsbeispiel?



## siba (17. Aug 2005)

Im Rahmen der Java-Zertifizierung beschäfitge ich mich gerade mit Inneren Klassen! Kann mir jemand einen sinnigen Anwendungsfall nennen? Wo bringen Innere Klassen tatsächlich Vorteile?

_L-ectron-X hat den Titel angepasst._


----------



## Sky (17. Aug 2005)

Zunächst mal klingt deine Aussage so, als würdest Du darin keine Vorteile sehen (evtl. sogar Nachteile).

IMHO bietet sich z.B. ein ActionListener an, in einer inneren Klasse implementiert zu werden.
Ansonsten gibt es in der API ein paar Beispiele; z.B. HTML und HTML.Tag


----------



## siba (17. Aug 2005)

Mir fällt es ehrlich gesagt sehr schwer, Innere Klassen als sinnvoll zu erachten. Beispiele mit dem ActionListener kenne ich, ich dachte eher an irgendwelche selbsterstellte Beispiele! Das einzige was mir dazu einfällt ist folgendes

public class Pfirsich {

        public class Kern{

        }
}

Würde dies der Logik von inneren Klassen entsprechen?


----------



## stev.glasow (17. Aug 2005)

Jop, obwohl innere Klassen meist anonym oder static sind.
[edit]
Hier mal ein Beispiel, dass mit einer anonymen und einer private statischen inner Class arbeitet

```
public class KomplexeDatenstruktur{

   private static float eineConstante = 4.6f; 
   
   private static class Data{
		/*
		  man kann sie auch sowohl öffentlich als auch als äußere Klasse machen, 
		  aber wenn man die Klasse 'Data' gar nicht an andere Stelle braucht, 
		  weil sie evtl. nur als Hilfklasse für diese 'KomplexeDatenstruktur' dient,
		  ist das eigentlich eine gute Lösung.
		  Es ist halt nur eine Schönheitsfrage und geht auch immer als äußere oder öffentliche innere Klasse.
		  Eine Klasse innerhalb einer anderen zu machen, kann auch den Vorteil haben, 
		  dass sie die privaten Varibalen der um schließenden Klasse nutzen kann.
		  Eine Statische inner Class kann dabei die statischen Varibablen nutzen und eine nicht statische sogar
		  die Instanz Variblen (Beispiel zum Schluss)
		  */
		
		
		public void setFoo(int foo){
		   this.foo = foo * eineConstante;
		}
		
		public byte[] getBytes(){
		   return  ...
		}

   }
    ...
    // ganz viele gemeine Sachen
    ...
    
	public InputStream asByteStream(){ 
	    return new InputStream(){ // halt die anonyme Klasse

                private final Iterator<Data> i = datas.iterator();
                
                private InputStream aktStream = null;
                
                public int read() throws IOException {
                    if(aktStream == null){
                        if(!i.hasNext()) return -1;
                        aktStream = new ByteInputStream(i.next().getBytes());
                    }
                    int r = aktStream.read();
                    while(r == -1 && i.hasNext()){
                        aktStream = new ByteInputStream(i.next().getBytes());
                        r = aktStream.read();
                    }
                    
                    return r;
                }
                
            };
	}

}
```

Hab ich glaub ich erst einmal benutzt aber hier noch eins  für eine nicht statiche öffentliche InnerClass


```
public class Fabrik{
	
	
	public static void main(String[] args){
	    Fabrik f = new Fabrik();
	    f.setAktYear(2002);
	    Fabrik.Car c1 = f.new Car();
	    System.out.println(c1.getQualtität());
	    
	    f.setAktYear(2006);
	    Fabrik.Car c2 = f.new Car();
	    System.out.println(c2.getQualtität());
	}
	
	private Foo w;
	private int aktYear;
	
	public void setFoo(Foo val){
	  w = val;
	}
	
	public void setAktYear(int y){
		this.aktYear = y;
	}
	
	public class Car{
		private final int baujahr;
	   	
	   	public Car(){
	   		this.baujar = aktYear;
	   	}
	   
	  
	   public float getQualtität(){
	      return foo * Math.PI * baujahr / 0815;
	   }
	
	}
}
```
Cool ist halt die starke Bindung der Klasse Car an die Fabrik Instanz , mit der man auch die privtaten Instanzvaribalen(siehe foo oder aktYear) nutzen kann.


so, hab keine Lust mehr, aber vieleicht hats etwas geholfen.

Für öffentlich statische Klassen sind
Point2D
Point2D.Double
Point2D.Float 
noch ein gutes Beispiel.


----------



## siba (18. Aug 2005)

Merci! Das Konzept ist mir mittlerweile viel klarer geworden!


----------

