2016-03-24 17 views
0

Ich habe Java seit einiger Zeit nicht mehr berührt, und ich bin ein wenig verwirrt darüber, wie das geht.Java - Füllen eines Arrays von einem Konstruktor

Ich habe eine Klasse „Foo“, die über ein eigenes Array von ints mit Größe 5.

Im Klassenkonstruktor ich diese 5 Ints passieren müssen hat, so habe ich so etwas wie dieses

public class Foo{ 

int [] numbers = new int[5]; 

Foo (int n0, int n1, int n2, int n3, int n4) { 
    numbers[0] = n0; 
    numbers[1] = n1; 
    numbers[2] = n2; 
    numbers[3] = n3; 
    numbers[4] = n4; 
} 

Das scheint zu viel Arbeit zu sein, und es gibt einen einfacheren Weg, es zu tun, ich komme einfach nicht dazu. So etwas wie eine für die auf das Array Länge begrenzt Schleife, wie

Foo(int n0, int n1, int n2, int n3, int n4, int s0, int s1) { 
    for (int i = o; i<= numbers.length; i++) { 
     numbers[i]= "n + i"; // This is wrong, but just to get the idea. 
    } 
} 
+1

Komm schon, mach es nicht kompliziert: 'public Foo (int [] Zahlen) {this.numbers = numbers; } ' –

+0

Wie beschränke ich meine Array-Größe in diesem Fall? Im eigentlichen Code muss ich mehr als ein Array füllen, also müsste ich in dieser Lösung die Größe des Earech-Arrays in den Argumenten angeben – Gryxs

Antwort

3

Die Antwort hängt etwas vom Kontext Ihrer Lösung ab.

Wenn die 5 Ganzzahlen aus derselben Domäne stammen und Teil einer Gruppe sein sollen, würde ich vorschlagen, ein einzelnes Argument zu übergeben, das diese Gruppe und nicht die 5 separaten Elemente darstellt. Java bietet gute Mechanismen, um verschiedene Sammlungen im laufenden Betrieb zu erstellen.

einige potenziellen ‚Gruppen‘ könnte sein:

public Foo(IntStream values) { ... } 
new Foo(Stream.of(1, 3, 5, 7, 9)); 

public Foo(int[] values) { ... } 
new Foo(new int[]{1, 3, 5, 7, 9}); 

public Foo(int... values) { ... } 
new Foo(1, 3, 5, 7, 9); 

public Foo(List<Integer> values) { ... } 
new Foo(Arrays.asList(1, 3, 5, 7, 9)); 

Alle diese bieten Methoden, um die Größe zu überprüfen, oder gestutzt und verdeckte ein internes Format, das Sie mögen. Dies erfordert minimale Änderungen, wenn sich die Anzahl der Werte ändert, die Sie senden möchten. Wenn Sie die spezifischen Werte fest codieren, ändert sich die Signatur des Konstruktors, wenn sich die Anzahl der Werte ändert.

Wenn andererseits die Argumente nicht in derselben Domäne sind, sondern tatsächlich unterscheidbare Attribute darstellen, dann ist es sinnvoll, sie als individuelle Argumente für den Konstruktor anzugeben. In diesem Fall ist es jedoch nicht sinnvoll, sie intern als Sammlung zu speichern. Daher müssen Sie wahrscheinlich die Standardmuster this.bar = bar verwenden, um die Werte in separaten Variablen zu speichern.

2

glaube ich der Konstruktor soll nicht als eine Funktion behandelt werden, die Einlage (add) Objekte in einer Datenstruktur. Wenn ich es täte, würde ich so etwas schreiben:

Foo(int size) { 
    this.numbers = new int[size]; 
} 

void insert(int n, int location) { 
    numbers[location] = n; 
} 

Dann können Sie eine Schleife verwenden, um von Ihrem Client-Programm (Haupt-) einfügen und ordnen Sie die location mit der Variablen i (for-Schleife-Zähler) . Das ist mein Vorschlag.

Hinweis: müssen Sie möglicherweise die Möglichkeit von array out of bounds Fehler irgendwie in Ihrem Code behandeln.

-1

Versuchen Sie es.

Foo(int... n) { 
    if (n.length != 5) 
     throw new IllegalArgumentException("specify 5 ints"); 
    for (int i = 0; i < 5; ++i) 
     numbers[i] = n[i]; 
} 
+0

Eine Antwort liefert Code * und eine anständige Erklärung des Problems und der wahrgenommenen Lösung *, und der andere nichts als ungeklärte "try this" -Code. Was denkst du ist besser? –

Verwandte Themen