web-dev-qa-db-fra.com

chaîne privée ou chaîne publique statique?

Lors de mon stage, un de mes collègues m'a donné un indice. Je veux savoir si c'est une bonne pratique.

Ce que je faisais était de créer des classes qui ne sont utilisées que pour les valeurs qu'elles contiennent et qui n'ont aucune fonction qui fasse quelque chose (à part avoir des getters, des setters et un constructeur). J'ai déclaré mes variables comme ceci:

public class ObjectIUse{
  Private String name;

  public ObjectIUse(String name){
    this.name = name;
  }

  public String getName(){
    return name;
  }
}

Donc, je n'utilise pas de passeur, car il devrait toujours rester le même. Mon collègue a dit que je pouvais aussi le faire de la manière suivante:

public class ObjectIUse{
  public final String name;

  public ObjectIUse(String name){
    this.name = name;
  }
}

Parce que maintenant nous n’avons pas besoin d’obtenteurs d’accès ou de passeurs parce que c’est public, mais cela ne peut jamais non plus être changé car c’est définitif. 

Quel serait le meilleur? Ou serait-il peut-être préférable de toujours le rendre privé mais aussi final? Je veux dire que toutes les options fonctionnent, évidemment. Je veux juste savoir lequel est le meilleur et pourquoi.

9
WereWolfBoy

Faites en sorte que la variable soit privée, car vous obtiendrez encapsulons la variable de votre classe. Cela présente de nombreux avantages, la dissimulation d'informations est l'un de ceux-ci, que vous apprendrez en cliquant sur le lien ci-dessus.

Si vous voulez que cela ne change jamais après la création, alors rendez-le final également.

7
MD Sayem Ahmed

Cela fonctionne maintenant parce qu'une String est immuable. Mais que se passe-t-il lorsque vous exposez la référence à une classe mutable et que cette classe n’est pas thread-safe? Vous ne pouvez même pas retourner une copie défensive si vous le souhaitez.

Sans parler de cela rompt également l'encapsulation. Utilisez une variable privée et des getters.

4
Deepak Bala

Je suppose que leur raisonnement est qu’avoir public simplifie le code. Java est critiqué pour être trop bavard dans des situations comme celle-ci. Sur une langue telle que Javascript où ce serait (normalement) toujours public

Mais cette simplicité est un compromis contre un code sécurisé, stable et extensible.

Pour comprendre pourquoi c'est important, jetez un coup d'œil à un projet Javascript à grande échelle qui a été écrit avec tout ce qui est public. Le code de chaque classe peut être simple… mais leurs relations et l'architecture résultante deviennent un cauchemar à entretenir.

1
David Lavender

Quel serait le meilleur? Ou serait-il peut-être préférable de continuer à faire c'est privé mais aussi final?

Si vous voulez être un bon développeur, vous devez programmer correctement, efficacement et en toute sécurité. La sécurité et la performance sont à la première place.

Quand vous le rendrez public, vous allez casser encapsuler c'est très important et comporte de nombreux avantages. Chaque fois que vous souhaitez acquérir la propriété d’Object, Getters deviendra votre ami. 

En règle générale, vous ne devriez pas avoir un accès direct aux propriétés de Object (uniquement dans des cas extrêmes, mais celles-ci peuvent également être résolues de manière plus efficace). Les Getters et les Setters sont conçus à ces fins - préservent l’encapsulation et traitent les objets en toute sécurité.

final variables sont généralement utilisés pour les données qui ne sont pas modifiables pendant une période donnée.

1
Simon Dorociak

L'idée de ne pas fournir de méthode de définition à une variable en fait un champ en lecture seule. Cela signifie que nous ne pouvons que lire, mais pas écrire, ce qui en fait une constante par l'utilisation du mot clé final résume tout.

Je pense qu'une constante est mieux. Le mot clé final améliore les performances. En savoir plus ici

1
tmwanik

Vous devez absolument avoir un getter et rendre votre domaine privé. C'est ce que nous appelons l'encapsulation.

De plus, en le rendant final et en évitant de définir un paramètre, votre objet est immuable, ce qui est une très bonne chose pour la programmation parallèle.

1
tibo

Une bonne utilisation du principe d’encapsulation consiste à rendre tous les champs de classe privés et à y accéder via des setters et des getters. En dehors de cela, vous pouvez ajouter une logique supplémentaire lorsque vous appelez getName(). Bien que la seconde variante soit parfois utilisée, la première est meilleure. J'espère que cela t'aides.

1
Egor

Je pense que ça dépend. Par exemple: si vous utilisez getter - vous pouvez le remplacer. Parfois, c'est très utile.

0
shapkin