Java: Jaký je rozdíl mezi těmito metodami výstavby

hlasů
5

Jaký je rozdíl mezi těmito dvěma způsoby inicializace pozorovatelů ArrayList. Nebo jakýkoli jiný typ na to přijde. Je jeden rychlejší než ostatní? Nebo jsem chybí některé další výhody zde.

class Publisher implements Observerable
{
     private ArrayList observers = new ArrayList();
}

class Publisher implements Observerable
{
    private ArrayList observers; 

    public Publisher()
    {
        observers = new ArrayList();
    }
}
Položena 25/07/2009 v 17:31
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
13

Jsou ekvivalentní. Ve skutečnosti, pokud kompilace dva, uvidíte, že vytvářejí přesně stejné byte kód:

Publisher();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   aload_0
   5:   new     #2; //class java/util/ArrayList
   8:   dup
   9:   invokespecial   #3; //Method java/util/ArrayList."<init>":()V
   12:  putfield        #4; //Field observers:Ljava/util/ArrayList;
   15:  return    
}

Vzhledem k tomu, že jsou stejný kód, tam jasně nemůže být rozdíl rychlostí :)

Všimněte si, že v jazyce C #, že nejste zcela rovnocenné - v jazyce C # Inicializátor pro observerspoběží před základní konstruktoru voláním; Java ve skutečnosti jsou stejné.

Který používáte, je otázkou vkusu. Pokud máte několik různých konstruktérů které všechny inicializovat proměnnou stejným způsobem by se mělo smysl používat první formulář. Na druhé straně, to je obecně dobrý nápad, pokud máte několik konstruktérů snažit, aby většina z nich říkají, kdo „core“ konstruktor, který dělá skutečnou práci.

Odpovězeno 25/07/2009 v 17:34
zdroj uživatelem

hlasů
4

Oni jsou si rovny, ale: tím rozdílem, že v posledním příkladu, získáte výhodu, že jsou schopni provádět pokročilejší inicializační logiku: Chyba manipulace atd

Odpovězeno 25/07/2009 v 17:35
zdroj uživatelem

hlasů
1

Tam to není opravdu žádný rozdíl. Výhodou prvního způsobu je, že pokud máte více konstruktérů, nemusíte mít na paměti inicializovat observersve všech z nich.

Ve druhém příkladu, můžete být pružnější, pokud chcete nastavit hodnotu na základě argumentů konstruktoru je.

Odpovězeno 25/07/2009 v 17:37
zdroj uživatelem

hlasů
2

Jediný skutečný rozdíl je v pořadí operací. Oblasti, které jsou inicializovány ve svém prohlášení jsou vyhodnoceny před konstruktoru třídy se nazývá. Oblasti, které jsou inicializovány v podtřídě tímto způsobem budou vyhodnoceny po Super jeho konstruktor je dokončen, ale před konstruktor podtřídy se nazývá.

Vezměme si následující příklad:

Mám testovací třída:

public class Tester {
    Tester (String msg) {
        System.out.println(this + ":" + msg);

    }
}

Mám super třída:

public class Test  {

   protected Tester t1 = new Tester("super init block");

   Test (String constructorMsg) {
    new Tester(constructorMsg);
   }
}

a mám podtřídy:

Public class TestSub extends Test {

   private Tester t2 = new Tester("sub init block");

   TestSub(String constructorMsg) {
      super(constructorMsg);
      new TTester("sub constructor");
   }

}

V mém mainzpůsobu, jsem vytvořit instanci TestSub:

public static void main(String[] args) {
    new TestSub("super constructor");

}

Výsledky jsou následující:

Tester@3e205f:super init block
Tester@bf73fa:super constructor
Tester@5740bb:sub init block
Tester@5ac072:sub constructor
Odpovězeno 25/07/2009 v 18:17
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more