tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Thomas Darimont
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
11229
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    gollrich gollrich ist offline Grünschnabel
    Registriert seit
    Nov 2004
    Beiträge
    3
    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
     

  2. #2
    Avatar von Oliver Gierke
    Oliver Gierke Oliver Gierke ist offline Mitglied Rubin
    Registriert seit
    Dec 2003
    Ort
    Mannheim
    Beiträge
    1.457
    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
    Geändert von Oliver Gierke (15.01.08 um 16:11 Uhr)
     

  3. #3
    MeinerEiner_80 Tutorials.de Gastzugang
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    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 :
    1
    2
    3
    4
    5
    
     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...
    Geändert von MeinerEiner_80 (15.01.08 um 16:42 Uhr)
     

  4. #4
    Anime-Otaku Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    905
    Damit eine Methode nicht überschrieben werden kann, muss diese in der Mutterklasse das Attribut final enthalten.

    nach ner kurzen Suche...hier haben auch schon einige über diese Frage diskutiert..
    http://www.jguru.com/faq/view.jsp?EID=88225
     
    Wäre super wenn ihr euren Code in dieser Form einfügt:
    Code java:
    1
    
    System.out.println("Hello World");
    [java]System.out.println("Hello World");[/java]
    Für erledigte Threads dürft ihr den "erledigt"-Button anklicken!
    Über Dank freut sich jeder, der euch geholfen hat - ein Klick auf "Danke" kostet ja nicht mal was
    Blog: http://javaeffective.wordpress.com/

  5. #5
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.885
    Blog-Einträge
    29
    Hallo,

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    /**
     * 
     */
    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
    Martin Rösch bedankt sich. 
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  6. #6
    Avatar von Chefkoch333
    Chefkoch333 Chefkoch333 ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    112
    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. #7
    Adrian_Broher Adrian_Broher ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    166
    Um es verstaendlich zu machen:

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

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    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

    Code java:
    1
    
    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.
     
    I'm not slacking off!

    My code's just compiling.

  8. #8
    Avatar von Chefkoch333
    Chefkoch333 Chefkoch333 ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    112
    Danke für die ausführliche Antwort!!
    Sehe jetzt die Problematik
     

  9. #9
    outdoorfreak outdoorfreak ist offline Grünschnabel
    Registriert seit
    Jul 2011
    Beiträge
    2
    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.
     

  10. #10
    outdoorfreak outdoorfreak ist offline Grünschnabel
    Registriert seit
    Jul 2011
    Beiträge
    2
    Sorry war zuschnell mit schreiben. Nach erneutem durchdenken hab ich rausgefunden, dass überschreibbare methoden ja gar nicht statisch sein können.
     

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 30.09.08, 16:22
  2. Interface in Methode übergeben?
    Von downset04 im Forum Java
    Antworten: 9
    Letzter Beitrag: 16.05.08, 21:28
  3. Static Variable in Methode
    Von higret im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 25.05.05, 15:20
  4. C++ .Net Thread ohne static methode
    Von splizzer im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 21.03.05, 09:13
  5. Antworten: 4
    Letzter Beitrag: 13.08.04, 18:20