static Methode in einem Interface


#1
Hallo,

ich versuche gerade ein Interface zu definieren, bei dem die implementierenden Klassen des Interface, umbedingt eine static Methode haben müssen.
Das Problem ist das man ja in Interfaces keine static Methoden definieren kann, aber ich auch in der implentierenden Klasse diese nicht static überschreiben darf ...
Gibt es da irgend ne Lösung dafür, oder übersehe ich da etwas ?

Nochmal zur Verdeutlichung, da ich den Text selber verwirrend finde :p

Interface A
{
public static String getIrgendwas();
}

Klasse B implements A
{
public static String getIrgendwas(){return "doof";};
}

Gruß Gollrich
 

Oliver Gierke

Erfahrenes Mitglied
#2
Welchen Sinn sollte denn bitte eine statische Methode in nem Interface haben. Hast du verstanden wozu Interfaces gut sind? Statische Methoden sollten die Ausnahme sein, da sie erstens nicht wirklich objektorientiert sind und zweitens zu nahezu untestbarem Code führen, da sie den Client an die Implementierung koppeln. Interfaces verhindern gerade das. Scheint, als hättest du einen grundsätzlichen Denkfehler im Design.

Gruß
Ollie
 
Zuletzt bearbeitet:
M

MeinerEiner_80

#3
Moin!
Wenn du uns verrätst, wozu du sowas benötigst, könnte man unter Umständen eine Lösung für das Problem finden...

*grüssle*
MeinerEiner

PS:
Auch wenn man solche Sachen mit Vorsicht geniessen muss, sowas geht schon:
Code:
public interface A {
    
    public static String test = "testA";
    
}
public class B implements A{
    public static String test = "testB";
    /** Creates a new instance of B */
    public B() {
    }
    
}
public class C implements A{
     public static String test = "testC";
   
    /** Creates a new instance of C */
    public C() {
    }
    
}
Code:
 public static void main(String[] args) {
        System.out.println(B.test); // Gibt testB aus
        System.out.println(C.test); // Gibt testC aus
        
    }

Aber hübsch ist sowas nicht...
 
Zuletzt bearbeitet von einem Moderator:
#5
Hallo,

Java:
/**
 * 
 */
package de.tutorials;

/**
 * @author Thomas.Darimont
 *
 */
public class MethodsOnInterfaces {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Interface.Methods.print();
    }
    
    static interface Interface{
        static class Methods{
            public static void print(){
                System.out.println("bubu");
            }
        }
    }

}
Gruß Tom
 

Chefkoch333

Erfahrenes Mitglied
#6
Hi,
bin auch gerade über diese Frage gestolpert. Allerdings habe ich noch kein vernünftiges Argument gefunden warum dies nicht möglich sein sollte. Ein Interface ist für mich in erster Linie ein Vertrag was eine Klasse für Methoden bereitstellt.
Warum static Methoden davon ausgeschlossen werden erschließt sich mir nicht.
@Oliver: Verstehe deine Aussage auch nicht warum eine static Methode in einem Interface die Implementierung an den Client? koppelt, oder warum dadurch etwas untestbar werden sollte.

Würde aber gerne wissen was sich die Java Designer bei dieser Regel gedacht haben. Man lernt ja nie aus ;-)

VG,
ck.
 
#7
Um es verstaendlich zu machen:

Es gibt eine Interface I, eine Klasse A und eine Klasse B. A und B implementieren I.

Java:
interface I {
    public static string doFoo();
}

class A implements I {
    public static string doFoo() {
        System.out.println("A does foo");
    }
}

class B implements I {
    public static string doFoo() {
        System.out.println("B does foo");
    }
}
Nun rufen wir

Java:
I.doFoo();
auf.

Preisfrage: Soll nun A.doFoo() oder B.doFoo() waehrend der Laufzeit ausgefuehrt werden? (Nein das ist kein gueltiger Code, sondern die Frage, die sich die Sprachdesigner stellen mussten).

@Oliver: Verstehe deine Aussage auch nicht warum eine static Methode in einem Interface die Implementierung an den Client? koppelt, oder warum dadurch etwas untestbar werden sollte.
Siehe oben. Es ist nicht bestimmbar welche Methode zur Laufzeit ausgefuehrt werden soll. Also muss man, wenn statische Methoden genutzt werden, den Client direkte an eine Klasse binden.

Wenn man diesen Syntax als Vertrag interpretieren wuerde, haette man imme noch das gleiche Problem, man braucht zum Aufruf der statischen Methode immer noch eine konktrete Klasse. Ob die Signatur in diesem Fall frei definiert wird oder per Vertrag festgelegt wird ist im Endeffekt irrelevant, weil es eine reine kosmetische Vorgabe ist.
 
#9
Obwohl es auf diesem Thread schon eine ganze Zeit keine Aktivität mehr gab möchte ich doch noch meinen Senf dazu geben:
Wenn du nur sichergehen willst, dass die betreffende methode in der entsprechenden Klasse existiert so definiere sie doch einfach in einer abstakten Basisklasse.
 

easy_da_man

Ramses Unkenbold
#11
Zar schon bisschen älter, aber man muss da schon was anfügen:
Dem Oli seine Aussage bezieht sich auf "alte Infos". Statische "factory" Methoden sind gar nicht mal so übel:

http://jlordiales.wordpress.com/2012/12/26/static-factory-methods-vs-traditional-constructors/

Eine statische Methode kann die Implementierung zurückgeben, und erhöht den Gebrauch der Komposition anstatt der Vererbung... was einiges besser ist.

Eine statische Methode im Interface ergibt aus dem folgenden Grund keinen Sinn:
Das Interface existiert im klassischen Sinn nicht... nur implementierende Klassen. Eine statische Methode exsitiert aber schon beim Starten des Programmes, bevor überhaupt irgendwelche Instanzen "erstellt" wurden. Da die Methoden eines Interfaces aber in implementierenden Klassen leben, die erstmal das Interface implementieren müssen, geht das gar nicht, da das Interface vor dem ersten Laden schon existiert, aber noch keine Implementierun existiert.

LG

Ramses
 

Neue Beiträge