# Warum sind Interface-Methoden public?



## -frank (7. Feb 2007)

Hallo,
ich würde gerne wissen, warum Inteface Methoden implizit als "public" definiert sind.

Ich habe zb in meinem Programm Objekte, die man an etwas anhängen kann. Das sind aber ganz unterschiedliche Objekte. Ich definiere daher das Interface "Appendable" mit beispielsweise der Methode "getAppendableInfomation()".

das ist für mich der Sinn von Interfaces. ich verstehe aber nicht, warum die Methode "getAppendableInformation()" public sein MUSS. kann ja auch sein, dass ich sie nur in diesem einem package benoetige. 

Ein großes Problem ist das natürlich nicht, aber ich würde gerne wissen, was der Sinn dahinter ist. Wollen mir die JavaEnwickler damit sagen, dass Interfaces, die nur lokal benutzt werden, keinen Sinn machen??

danke!


----------



## Leroy42 (7. Feb 2007)

Hmmhh!  ???:L Interessante Frage...


----------



## thE_29 (7. Feb 2007)

Naja, ich finde das "friend" von C++ manchmal um weiten besser als java 

Was ist wenn ich eben alles verbieten, aber für die eine Klasse nicht..


----------



## Beni (8. Feb 2007)

Ich habe ein bisschen rumgesucht, im Sun-Forum fand ich z.B. das hier:


> From the Java Language Spec, Section 6.6 Access Control:
> "The Java programming language provides mechanisms for access control, to prevent the users of a package or class from depending on unnecessary details of the implementation of that package or class."
> 
> Access control is all about hiding implementation details. An interface has no implementation to hide.



Das automatische public wurde sogar in die Bug-Database eingetragen, aber jedesmal mit "das ist absichtlich so" geschlossen.

Eine offizielle Erklärung habe ich aber auch nicht gefunden. :cry:


----------



## thE_29 (8. Feb 2007)

Hier gibts viel zum Lesen 

http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.html

Aber es steht halt immer nur sowas: All members of interfaces are implicitly public.


Hahaha!!!


Wenn man es so schreibt:


```
interface Interface1
{
  public void bla()
}
```

Dann kann man es nur implementieren wenn es auch im gleichen Package ist! Somit kann man sich wenigstens so absichern  (wenn man protected oder private schreibt mekkert er)


Wenn man aber public interface schreibt und bei der Methode einfach den public Namen weglässt, macht er es trotzdem public!


----------



## Tobias (8. Feb 2007)

Yo, aber bei jeder implementierenden Klasse sind die Methoden dann wieder öffentlich zugänglich...

mpG
Tobias


----------



## AlArenal (8. Feb 2007)

Indirekte Antwort:
In Smalltalk ist alles public und damit kann man auch professionell coden (siehe: http://www.cadence.com/ ). Stellt euich also nicht so mimosenhaft an! 

In der Tat ist es aber schwierig hier per Suchmaschine etwas zu finden, weil die passenden Suchbegriffe millionenfach im Netz zu finden sind, aber eben nicht in solch einer edlen Diskussion.

Vielleicht sollte man sich das mal erbloggen, oder direkt mal einen von Sun nerven. Ich kenne aber nur die Köpfe vom Swing-Team


----------



## thE_29 (8. Feb 2007)

Dann Frag die Köpfe vom Swing Team, sie sollen dir die Mail addys von den Konzepttypen schicken 

Und wenn du es so schreibst


```
class InterfaceImpl implements Interface
..
```

Kann man von außen auch net zugreifen  Und somit nicht auf die public Methoden... Ist zwar net der richtig gewünschte Effekt, aber tjo...


----------



## Leroy42 (8. Feb 2007)

AlArenal hat gesagt.:
			
		

> In Smalltalk ist alles public und damit kann man auch professionell coden



Aber genau diese Eigenschaft von Smalltalk ist es, die es,
meiner Meinung nach, verhindert hat, daß Smalltalk der
Durchbruch im produktiven Bereich nicht gelungen ist.


----------



## AlArenal (8. Feb 2007)

Leroy42 hat gesagt.:
			
		

> Aber genau diese Eigenschaft von Smalltalk ist es, die es,
> meiner Meinung nach, *verhindert* hat, *daß Smalltalk der
> Durchbruch* im produktiven Bereich *nicht gelungen ist*.



Ja, alle lieben Smalltalk!

http://www.spiegel.de/kultur/zwiebelfisch/0,1518,394969,00.html


----------



## Leroy42 (8. Feb 2007)

Mist!!!!  :x 

Das ausgerechnet du mich erwischen könntest,
hätte mir vorher klar sein müssen.

(Ich geh' jetzt freiwillig in die Ecke und schäme mich.   )


----------



## AlArenal (8. Feb 2007)

Ja, der Teufel ist ein Eichhörnchen...

Ich warte noch auf Reaktionen aus der Blogosphäre auf meine entsprechenden BLog-Einträge. Nötigenfalls würde ich noch einen Hilferuf an die Java-Coder in Second Life schicken. Wenn das alles nichts bringt, sähe ich mich genötigt Meister ihres Faches zu quälen.

Aber vermutlich gibt es eine ganz plausible Erklärung, nur sind wir unwürdig sie zu verstehen...

P.S.:
Ich habe einen buschigen Schwanz...


----------



## stev.glasow (8. Feb 2007)

> das ist für mich der Sinn von Interfaces. ich verstehe aber nicht, warum die Methode "getAppendableInformation()" public sein MUSS. kann ja auch sein, dass ich sie nur in diesem einem package benoetige.


Das liegt evtl daran dass höchsten die Einschränkung auf das package Sinn macht - was nicht wirklich wichtig ist, denn das Interface kannst du ja default setzen um so den Zugriff aller Methoden auf das package zu beschränken. Und sehe jetzt nicht so viele Fälle wo es von Nöten ist einige Methoden eines Interfaces öffentlich zugänglich zu machen und einige auf das package zu beschränken.




			
				thE_29 hat gesagt.:
			
		

> Dann kann man es nur implementieren wenn es auch im gleichen Package ist! Somit kann man sich wenigstens so absichern  (wenn man protected oder private schreibt mekkert er)


Und welchen Sinn macht es ne Methode in nem Interface private oder protected zu machen?
Inbesondere ein Anwendungsbeispiel von private und eins wo es Sinn macht den Aufruf einer Interface-Methode auf die Unterklassen zu beschränken würden mich interessieren  :bahnhof:



			
				AlArenal hat gesagt.:
			
		

> P.S.:
> Ich habe einen buschigen Schwanz...


öh  :lol: Im Second Life hinten oder im First Life vorne?


----------



## Aske (9. Feb 2007)

Für mich liegt der Sinn in einem Interface darin, daß es die Schnittstellen einer Klasse nach außen definiert. Und da macht es doch wenig Sinn, diese Schnittstellen als private zu definieren?!
Es ist doch z.B. so gedacht:


```
public Interface IDBZugriff(){
    public connection connect(....);
}

public class DatenbankanwendungMySQL implements IDBZugriff{ 

    public connection connect(){
        ......
        ......
        ......
    }
   
}

public class DatenbankanwendungDB2 implements IDBZugriff{ 

    public connection connect(){
        ......
        ......
        ......
    }
   
}

public class Run(){
    
    // und nun entweder oder:
    IDBZugriff dao = new DatenbankanwendungDB2();
    IDBZugriff dao = new DatenbankanwendungMySQL();
    //die beiden einzigen Zeilen, die sich im Hauptprogramm ändern

    dao.connect();
}
```

Die Private Methoden würdest Du nun per Hand in die Klassen DatenbankanwendungMySQL oder DB2 implementieren, aber im Interface hätten sie nun nichts zu suchen. Zumindest verstehe ich so den Sinn von Interfaces, aber ich lasse mich gerne belehren ;-).

Gruß, Aske


----------



## -frank (12. Feb 2007)

stevg hat gesagt.:
			
		

> Das liegt evtl daran dass höchsten die Einschränkung auf das package Sinn macht - was nicht wirklich wichtig ist, denn das Interface kannst du ja default setzen um so den Zugriff aller Methoden auf das package zu beschränken. Und sehe jetzt nicht so viele Fälle wo es von Nöten ist einige Methoden eines Interfaces öffentlich zugänglich zu machen und einige auf das package zu beschränken.



hmm, ich kapiers nicht ganz:
also dass man nur sehr selten einige methoden eines interface gesondert beschränken will, kann ich nachvollziehen. eventuell wäre es dann ohnehin besser, wenn man zwei verschiedene interfaces macht, oder?

aber wenn ich in meinem Beispiel oben getAppendableInformation() nur package-intern benötige, die das Interface implementierende Klasse aber public sein muss, dann sieht man diese Interface-Methoden auch außerhalb.
Man hat zwar keinen Zugriff auf das Interface, wenn dieses default visibility hat, aber sehr wohl auf die das Interface implementierenden Methoden der Klasse, da letzere public sein muss und die Methode eben nicht niedriger als public gesetzt werden kann.


----------



## Wildcard (12. Feb 2007)

Was ist denn das für ein Blödsinn?
In einem Interface ist alles public (was ja auch Sinn eines Interfaces ist, da es die Schnittstelle nach aussen darstellt).
Lässt man den access modifier weg, sind die Methoden weiterhin public, da das lediglich eine Abkürzung für Schreibfaule ist.


----------



## stev.glasow (12. Feb 2007)

> Man hat zwar keinen Zugriff auf das Interface, wenn dieses default visibility hat, aber sehr wohl auf die das Interface implementierenden Methoden der Klasse, da letzere public sein muss und die Methode eben nicht niedriger als public gesetzt werden kann.


Hm, stimmt. Man kann zwar das Interface nicht außerhalb des paketes verwenden aber die implementierten Methoden ...  denkfehler drin gehabt.


@Aske: mein reden


----------



## thE_29 (13. Feb 2007)

Genau, wenn man ein Interface ohne irgendwas schreibt, dann kann es von außerhalb net angesprochen werden!

Also so: interface bla{..}

Die Methoden sind aber public ^^

Außerdem hatte ich nie von private Methoden geredet, mir würden schon protected Mehtoden auch reichen!


----------



## SnooP (13. Feb 2007)

hm... die protected Methoden gehören aber nu mal zu einer Vererbungshierachie und Interfaces sind ja gerade davon entkoppelt... - das einzige was also evtl. Sinn machen könnte, wäre package-private... aber das ist imho sowieso ne blöde Sichtbarkeit  - die kann man auch gleich weglassen *g*


----------



## Leroy42 (13. Feb 2007)

Langsam wirds hier richtig philosophisch.


----------

