2016-11-19 2 views
-2

Für ein Beispiel werde ich libgdx (Game Engine) verwenden, aber das ist eine Frage darüber, wie Java funktioniert, die ich nicht gefunden habe.Wenn ein Objekt als Parameter übergeben wird, wird mehr Speicher verwendet?

Dies ist die soundControler Klasse:

private final Sound s_0 = Gdx.audio.newSound(Gdx.files.internal("a.mp3"));; 
private final Sound s_1 = Gdx.audio.newSound(Gdx.files.internal("a.wav")); 
//lot of more variables 

public void shoot(short sound){ 
    if(SOUND_ENDABLED) { 

     switch (sound) { 
      case 0: 
       s_0.play(); 
       break; 
      case 1: 
       s_1.play(); 
       break; 
     } 
    } 
} 

das so ist im Grunde eine Bibliothek von Tönen in den Speicher geladen, die das Programm wird ständig werden.

Ein weiteres Beispiel:

Lassen Sie uns sagen, wir haben eine Animator Klasse, die eine Menge von Methoden für jede Animation im Spiel haben wird.

Ist das eine gute Praxis? Oder werde ich jedes Mal, wenn ich die soundControler als Parameter übergebe, eine neue Kopie aller Sounds und Methoden im Speicher erstellen?

+1

Möglicherweise verwandt: [Ist Java-Pass-by-Referenz oder Pass-by-Wert] (http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by- Wert)? – nbrooks

Antwort

1

Ich glaube nicht, das Problem ist, "wenn Sie den Sound-Controller als Parameter übergeben", aber wenn Sie eine Instanz instanziieren. Sie werden diese Methoden jedes Mal aufrufen, wenn die Instanz instanziiert wird. Ist es nötig?

Wenn Sie die Variablen statisch machen, dann würde der Code nur ausgeführt werden, wenn die Klasse instanziiert wird, dh einmal für die Ausführung des Programms (eigentlich die Ausführung der Instanziierung für diesen Klassenlader, aber für die meisten Zwecke einmal für den Lauf) des Programms). Wenn sie sich nie ändern, nachdem sie zum ersten Mal gesetzt wurden, können sie statisch sein, ohne einen negativen Effekt zu haben.

Sie haben nicht gefragt, aber ich werde das trotzdem kommentieren - ich verstehe nicht, warum Sie (und VIELE andere Leute) Fallanweisungen anstelle von Arrays verwenden. Setzen Sie die Sounds in ein Array (oder eine Hash-Map, wenn Sie keine passenden Integer haben, um in ein Array zu indizieren); Dann indexieren Sie einfach mit Ihrer sound Variablen in dieses Array und Sie sind fertig. Ihr Code ist viel kürzer und einfacher zu verstehen und läuft mindestens genauso schnell.

Ein kompilierten Beispiel:

private static Sound[] allSounds; 
private static String[] allSoundFiles 
    = { "a.mp3", "a.wav" /* ... * }; 

static 
{ 
    allSounds = new Sound[allSoundFiles.length]; 
    index = 0; 
    for (String s:allSoundFiles) 
    { 
    allSounds[index] = 
     Gdx.audio.newSound(Gdx.files.internal(s); 
    } 
} 

public void shoot(short sound) 
{ 
    if (SOUND_ENABLED) // or ENDABLED if you prefer 
    { 
    allSounds[sound].play(); 
    } 
} 

Das einzige, was mit mehr Sounds wächst die Liste der Dateinamen. Dies setzt voraus, dass alle geladenen Sounds natürlich eine play() Funktion haben.

+0

wird nur einmal instanziieren, aber es an viele andere Klassen übergeben, wenn also jedes mal als Parameter übergeben wird, macht java eine Kopie der Variablen Ich bin in truble – user5450074

+0

Nein, der Code zum Initialisieren der Variablen wird nur bei Instanziierung ausgeführt; Wenn Sie nur einmal instanziieren, wird der Code nur einmal ausgeführt. Wenn Sie das testen wollten, könnten Sie eine Methode aufrufen, die nicht nur den Wert initialisiert, sondern etwas in sysout schreibt, so dass Sie das nur einmal sehen können. Eine Klasse mit einer einzelnen Instanz in einem Programm wird bei Interesse als Singleton bezeichnet. – arcy

Verwandte Themen