46 votes

Avons-nous un champ en lecture seule en Java (qui peut être défini dans le cadre de la classe elle-même) ?

Comment pouvons-nous avoir une variable qui soit accessible en écriture dans la classe mais seulement « lisible » à l'extérieur ?

Par exemple, au lieu d'avoir à faire ceci :

 Class C {
  private int width, height;

  int GetWidth(){
    return width;
  }

  int GetHeight(){
    return height;
  }

  // etc..

J'aimerais faire quelque chose comme ça :

 Class C {
  public_readonly int width, height;

  // etc...

Quelle est la meilleure solution ?

50voto

Aliaksei N. Points 1678

Créez une classe avec des champs public final Fournissez le constructeur où ces champs seraient initialisés. De cette façon, votre classe sera immuable, mais vous n'aurez pas de surcharge pour accéder aux valeurs de l'extérieur. Par exemple:

 public class ShortCalendar
{
    public final int year, month, day;

    public ShortCalendar(Calendar calendar)
    {
        if (null == calendar)
            throw new IllegalArgumentException();

        year = calendar.get(Calendar.YEAR);
        month = calendar.get(Calendar.MONTH);
        day = calendar.get(Calendar.DATE);
    }
}

5voto

Thomas Uhrig Points 3955

il n'y a aucun moyen de rendre un champ "lecture seule" de l'extérieur. le seul - et le bon - moyen est de rendre les champs privés et de ne fournir que des getters, pas de setters.

1voto

helpermethod Points 11015

En fait, le compilateur HotSpot ferait très probablement des appels en ligne à vos getters, donc aucune surcharge ne sera impliquée (en outre, la surcharge pour appeler ces méthodes serait difficilement mesurable).

ÉDITER

Si vous avez vraiment besoin de chaque cycle CPU, utilisez C ou C++ (ou écrivez-y des parties critiques pour les performances et appelez-les via JNA, bien qu'il soit peu probable que cela en vaille la peine).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X