2010-08-19 3 views
1

Je travaille sur un jeu. La vue, le fil et le moteur sont terminés. Maintenant, je vais dans comment, par exemple, définir les coordonnées de mon bitmap.Évitez les getters/setters internes - Jeu

Je l'ai fait avec succès en utilisant la méthode getters/setters. J'ai lu sur le web la plupart des bons développeurs de jeux qui disent que "rendre votre variable membre public" et tout ça. Depuis que j'ai lu la section Évitez les internes Getters/Setters au http://developer.android.com/guide/practices/design/performance.html, j'ai commencé à me demander: Comment puis-je changer ma classe Coordinates pour y parvenir sans "setters" par exemple?

Maintenant mon regard Coordonnées de classe comme:

package com.mygame.mygame; 

public class Coordinates { 
    int x; 
    int y; 
    Coordinates instance = null; 

public Coordinates getInstance(){ 
    if(instance == null){ 
    instance = new Coordinates(); 
    } 
    return instance; 
} 

    public Coordinates() {  
    } 

    public int getX() { 
     return x; 
    } 

    public void setX(int value) { 
     x = value; 
    } 

    public int getY() { 
     return y; 
    } 
    public void setY(int value) { 
     y = value; 
    } 

} 

Comment dois-je changer mon code pour y parvenir? Les appels de méthode sont chers, mais je n'ai toujours aucune idée de la façon de restructurer mon code actuel sans les getters et les setters.

MISE À JOUR

public GameEngine getInstance(){ 
if(instance == null){ 
    instance = new GameEngine(resources,view); 
    } 
    return instance; 
    } 

MISE A JOUR 2

GameEngine

static Resources res; 

static GameView view; 

static GameEngine instance = null; 

public static GameEngine getInstance(Resources localResources, GameView localView){ 
    view = localView; 
    res = localResources; 
    if(instance == null){ 
     instance = new GameEngine(); //Init-stuff in the GameEngine 
    } 
    return instance; 
} 

et mon Gameview

static GameEngine engine; 
public GameView(Context localContext) { 
    //Other stuff 
    engine = GameEngine.getInstance(context.getResources(), this); 
    //Other stuff 
} 

Merci d'avance!

Répondre

3

Vous semblez avoir mal compris le mot "interne". Ce document est plus vous dit que vous devriez pas faire par exemple:

public Coordinates(int x, int y) { 
    setX(x); 
    setY(y); 
} 

mais plus

public Coordinates(int x, int y) { 
    this.x = x; 
    this.y = y; 
} 

En d'autres termes, évitez d'utiliser getters/setters dans le même classe où ils sont définis.

Votre classe actuelle ne le fait d'ailleurs nulle part. Seule la méthode getInstance() est simplement inutile dans ce contexte. Je m'en débarrasserais. Public est la valeur par défaut des membres, sauf spécification contraire.

+0

Wow! Ça a du sens! Mais, est-ce que c'est la façon de le faire? Les appels de méthode ne sont-ils pas chers dans ces perspectives aussi? Eh bien, j'ai les appels de méthode dans mon moteur. – Curtain

+0

C'est la pratique normale, oui. En ce qui concerne le coût, les appels à la méthode getter/setter sont particulièrement bon marché, c'est plus une question de style. Mais dans une machine avec seulement quelques ressources et peu ou pas d'optimisations JIT comme les téléphones mobiles, j'imagine que chaque optimisation est plus que bienvenue. – BalusC

+0

Eh bien d'accord, alors c'est mon chemin à parcourir alors. J'ai mis à jour mon code avec un morceau de code de mon GameEngine. Cette Instance est-elle inutile aussi? – Curtain

1

public est la valeur par défaut des membres. N'utilisez pas le getter ou le setter pour x et y.

+0

La visibilité par défaut n'est pas publique. Comme dans le code actuel, les membres sont visibles par les classes dans le même package uniquement. – BalusC