2017-04-13 1 views
2

Ich habe Code in der Klasse Foo mit der Methode doSomething() gefunden, die eine Instanz der Klasse foo erzeugt.Ist es Standardübung, eine Instanz einer Klasse innerhalb dieser Klasse zu erstellen?

public class Foo { 
    public void doSomething() { 
     Foo foo1 = new Foo(); 
    } 
} 

Ist diese Standardpraxis? Es scheint eine sehr merkwürdige Art zu sein, über Dinge zu gehen. Warum möchtest du so etwas tun? Gibt es Gefahren, Code auf diese Weise zu erstellen? Gibt es einen Grund, warum du dies tun möchtest anstatt eine andere Praxis zu benutzen? Und schließlich ist meine Intuition, dass jede Methode, die so etwas macht, als statisch deklariert werden sollte. Ist das korrekt?

+0

IMHO ist es nicht, und ist sehr selten (es sei denn, die Methode ist statisch). –

Antwort

5

Ja, das ist Standard. Es ist nicht gemeinsame (in einer Instanz-Methode, häufiger in static s), aber es ist vollkommen Standard.

Der Code in Foo zu sein, ist weitgehend irrelevant: Wenn der Code eine Foo Instanz anders als this aus irgendeinem Grunde braucht, dann ist es es ist völlig normal, eine Instanz zu erstellen und verwenden.

Es ist nicht wirklich mehr ungerade als eine Methode, die zwei Instanzen einer anderen Klasse erstellt:

class Foo { 
    void method() { 
     Bar b1 = new Bar(); 
     Bar b2 = new Bar(); 
     // ... 
    } 
} 

Vermutlich method Bedürfnisse sowohl Bar Instanzen. In ähnlicher Weise benötigt doSomething offenbar eine andere Foo als this.

Ein Ort, den Sie besonders sehen, sind unveränderliche Objekte mit fließenden Schnittstellen, wobei die meisten Methoden eine Instanz des Objekts mit einem geänderten Aspekt zurückgeben.

public class Thingy { 
    private int a; 
    private int b; 

    public Thingy(a, b) { 
     this.a = a; 
     this.b = b; 
    } 

    public Thingy withA(int newA) { 
     return new Thingy(newA, this.b); 
    } 

    public Thingy withB(int newB) { 
     return new Thingy(this.a, newB); 
    } 

    public int getA() { 
     return this.a; 
    } 

    public int getB() { 
     return this.b; 
    } 

    // ... 
} 

Normalerweise sind die withX Methoden sind interessanter als das, aber Sie erhalten die Idee ... String ein Beispiel dafür ist, wie 5tingr4y betont: toUpperCase, substring, ...

+0

@JornVernee: LOL - Ich dachte an die Unveränderlichkeit die zweite nach dem Posten und fügte es hinzu, siehe oben. :-) –

+0

oder RecursiveTask :) – HRgiger

+1

Strings wäre ein gutes Beispiel dafür. trim() und subString (...) und Zeug geben neue Strings zurück. – 5tingr4y

1

Ja, Es ist in Ordnung. Ein gutes Beispiel ist ein binary tree, die (in der Regel) geordneten Knoten innerhalb des übergeordneten Knoten erzeugt zu wachsen:

class Node { 
    Node left, right; 
    int value; 
    Node (int i) { 
     value = i; 
    } 
    void add(int i) { 
     if (i < value) 
     left = new Node(i); // must create Nodes within Nodes 
     else 
     right = new Node(i); // must create Nodes within Nodes 
} 
+0

Tolles Beispiel. .. –

Verwandte Themen