Новичок в Java: приводит ли приведение к снижению производительности каким-либо образом? - PullRequest
1 голос
/ 28 декабря 2010

, когда я создаю Animal x=new Dog(); и хочу использовать функции Dog, мне придется разыгрывать правильно? ((Dog)x).bark(); так скажем, я бы использовал это много раз для циклов for, приводит ли это к снижению производительности? также есть ли другой способ, кроме кастинга каждый раз?

Ответы [ 4 ]

4 голосов
/ 28 декабря 2010

Приведение типа

Dog dog = (Dog) animal;

является так называемым «проверочным» приведением.Таким образом, во время выполнения это простое выражение if (является примером реализации животного в Dog), которое выдает ClassCastException.Так что, по крайней мере, он не обеспечит каких-либо разумных накладных расходов на производительность, если приведение в порядке, но если оно завершится неудачей, оно выдаст исключение, а обработка исключений является «операцией», потребляющей производительность.

Так что, если вы приведете sometingактерский состав не провалится, я считаю, что нет проблем с производительностью.Но если у вас есть приведение, которое очень часто дает сбой, вам следует немного изменить свой алгоритм.

1 голос
/ 28 декабря 2010

Я обычно использую тип реализации локально, возвращая базовый тип. Примерно так:

public Animal createAnimal(){
    Dog dog = new Dog();
    dog.bark();
    dog.bite();
    dog.houl();
    return dog;
}
1 голос
/ 28 декабря 2010

Кастинг всегда добавляет накладные расходы, но трудно сказать, будет ли это узким местом для вашего приложения. Это будет зависеть от вашего сценария. Вы можете избежать нескольких приведений, выполнив это вне цикла:

Animal x = new Dog();
Dog dog = (Dog)x;
Now loop and call dog.bark() as many times as you like
0 голосов
/ 28 декабря 2010

Допустим, класс Dog выглядит следующим образом:

package test;
public class Dog extends Animal {
    public void bark(){
        System.out.println("Woof woof");
    }
}

А класс Animal выглядит следующим образом:

package test;
public class Animal {
    public void sayHello(){
        System.out.println("Hello !!");
    }

    public static void main(String[] args) {
        Animal a = new Dog();
        a.sayHello();
        ((Dog)a).bark();
    }
}

Если вы видите сгенерированный байт-код, он будет выглядеть так:

Compiled from "Animal.java"
public class test.Animal extends java.lang.Object{
public test.Animal();
  Code:
   0:   aload_0
   1:   invokespecial   #8; //Method java/lang/Object."<init>":()V
   4:   return

public void sayHello();
  Code:
   0:   getstatic   #15; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc #21; //String Hello !!
   5:   invokevirtual   #23; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   return

public static void main(java.lang.String[]);
  Code:
   0:   new #31; //class test/Dog
   3:   dup
   4:   invokespecial   #33; //Method test/Dog."<init>":()V
   7:   astore_1
   8:   aload_1
   9:   invokevirtual   #34; //Method sayHello:()V
   12:  aload_1
   13:  checkcast   #31; //class test/Dog
   16:  invokevirtual   #36; //Method test/Dog.bark:()V
   19:  return

}

Итак, как вы видите, здесь есть дополнительный checkcast, который разрешается по этой ссылке:

http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc2.html

Во избежание задержкив цикле, как блоки: приведите вне цикла и затем используйте ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...