2016-05-04 4 views
-2

Angesichts der Klasseaus Schnittstelle Casting vs von Elternklasse

public class Dog extends Animal implements Friend{ 

    ... 
} 

Welche der folgenden Aussagen ist teurer Leistung klug?

Dog myDog = (Dog) someAnimal;//where Animal someAnimal 

oder

Dog myDog = (Dog) someFriend;//where Friend someFriend 

Ich verstehe diese Frage einige Erfahrung erfordern kann zu beantworten, so vielen Dank für Ihre Hilfe. Bitte geben Sie einige wertvolle Erläuterungen.

+1

tatsächlich gibt es Kosten. Diese Frage ist also für die Experten nicht Anfänger: http://www.javaworld.com/article/2076555/build-ci-sdlc/java-performance-programming--part-2--the-cost-of-casting. html –

+0

Ich sehe Sie entfernen Sie Ihren Kommentar, der sagte, dass es keine Kosten gab. Sie sollten Ihre Down-Abstimmung für die Integrität entfernen. –

+0

Könnten Sie sich meine Antwort ansehen und mir sagen, ob sie Ihre Frage beantwortet oder ob Sie noch etwas geklärt haben? Ich stimme zu, dass die Downvotes nicht unbedingt gerechtfertigt sind, aber der Versuch, sie zu entfernen, wird wahrscheinlich nicht mit extremer Effizienz gelingen. – hexafraction

Antwort

5

Weder wird teurer sein, wenn Sie Bytecode betrachten. Ich würde mich stattdessen über den massiven Overhead des Konstruierens und Werfens von ClassCastExceptions Gedanken machen, was in beiden Fällen passiert, , wenn die Besetzung fehlschlägt. Auf jeden Fall wird dir instanceof auch nicht besonders weh tun, und du wirst mit weniger Leistungseinbußen davonkommen, wenn die Besetzung nicht stattfinden kann.

public static void main(java.lang.String...); 
    Code: 
     0: ldc   #2     // String a 
     2: astore_1 
     3: getstatic  #3     // Field java/lang/System.out:Ljava/io/PrintStream; 
     6: aload_1 
     7: checkcast  #4     // class java/lang/String 
     10: invokevirtual #5     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     13: return 

und Gießen eine Klasse zu einer Unterklasse:

Hier eine Variable als CharSequence (Schnittstelle) zu String deklariert Gießen

public static void main(java.lang.String...); 
    Code: 
     0: new   #2     // class A$B 
     3: dup 
     4: invokespecial #3     // Method A$B."<init>":()V 
     7: astore_1 
     8: getstatic  #4     // Field java/lang/System.out:Ljava/io/PrintStream; 
     11: aload_1 
     12: checkcast  #2     // class A$B 
     15: invokevirtual #5     // Method java/io/PrintStream.println:(Ljava/lang/Object;)V 
     18: return 
} 

Wie auch immer, hier ist die Wirkung von instanceof:

public static void main(java.lang.String...); 
    Code: 
     0: new   #2     // class A$B 
     3: dup 
     4: invokespecial #3     // Method A$B."<init>":()V 
     7: astore_1 
     8: aload_1 
     9: instanceof #2     // class A$B 
     12: ifeq   25 
     15: getstatic  #4     // Field java/lang/System.out:Ljava/io/PrintStream; 
     18: aload_1 
     19: checkcast  #2     // class A$B 
     22: invokevirtual #5     // Method java/io/PrintStream.println:(Ljava/lang/Object;)V 
     25: return 

Wie Sie sehen können, ist es nur ein zusätzlicher Bytecode operati on (die in der Regel nur einige Elemente der Objektinstanz überprüft, so wie sie im Speicher vorhanden ist) und eine if-Anweisungsverzweigung.