9
votes

Classe mutable ou immuable?

J'avais lu dans un livre de conception que la classe immuable améliore l'évolutivité et sa bonne pratique pour écrire une classe immutable dans la mesure du possible. Mais je pense que si une classe immuable augmente la prolifération d'objet. Il est donc bon d'aller de la classe immuable ou de mieux aller pour la classe statique (une classe avec toutes les méthodes statiques) pour améliorer l'évolutivité?


0 commentaires

8 Réponses :


15
votes

L'avantage principal de Les classes immuables sont cependant que vous pouvez exposer des éléments de données internes immuables parce que l'appelant ne peut pas les modifier. C'est un problème énorme avec, disons, java.util.date . Il est mutable pour que vous ne puissiez pas le retourner directement à partir d'une méthode. Cela signifie que vous finissez par faire toutes sortes de Copie de défensive . Qui augmente la prolifération d'objet.

L'autre avantage majeur est que les objets immuables n'ont pas Synchronisation Problèmes , par définition. C'est là que le évolutivité Les problèmes entrent. Écrire le code multithreaded est difficile. Les objets immuables sont un bon moyen de (principalement) contourner le problème.

Quant aux "classes statiques", par votre commentaire, je le prends pour signifier les cours avec Méthodes d'usine , c'est comment il est généralement décrit. C'est un modèle sans rapport. Les classes mutables et immuables peuvent avoir des constructeurs publics ou des constructeurs privés avec des méthodes d'usine statiques. Cela n'a aucun impact sur la mutabilité (IM) de la classe puisque une classe mutable est une classe mutable qui peut être modifiée après la création, tandis que l'état d'une classe immuable ne peut pas être modifié après l'instanciation.

Les méthodes d'usine statiques peuvent toutefois avoir d'autres avantages. L'idée est d'encapsuler la création d'objets.


3 commentaires

Une classe statique est une classe que vous n'avez jamais instanciate, mais utilisez ses méthodes fournies (par exemple, des tableaux de Java). Je ne vois pas comment ils pourraient remplacer les classes immuables si ...


Probablement "classe statique" ici est juste un synonyme de "classe immuable". Rien d'autre n'a de sens.


Utilisation de "classe statique", je veux dire une classe qui contient toute la méthode statique avec le constructeur privé (l'utilisateur ne peut donc pas créer d'instance de même classe) sans aucun élément statique. Désolé de créer de la confusion.



1
votes

comme Cletus dit, classes immuables simplifie la conception de la classe et la manipulation des méthodes synchronisées.

Ils simplifient également la manipulation des collections, même dans des applications à une seule fois. Une classe immuable ne changera jamais, la clé et le hashcode ne changeront pas, de sorte que vous ne bousez pas vos collections.

Mais vous devez garder à l'esprit le cycle de vie de la chose que vous modélisez et le "poids" du constructeur. Si vous devez changer la chose, des objets immuables deviennent plus complexes pour traiter. Vous devez les remplacer, plutôt que de les modifier. Pas terrible, mais la peine d'être considérée. Et si le constructeur prend du temps nonitridique, c'est un facteur aussi.


0 commentaires

0
votes

L'immuabilité est généralement utilisée pour réaliser une évolutivité, car l'immuabilité est l'une des facilitations en matière de programmation simultanée en Java. Donc, alors que vous soulignez, il peut y avoir plus d'objets dans une solution «immuable», il peut s'agir d'une étape nécessaire pour améliorer la concurrence.

L'autre, utilisation tout aussi importante Immutabilité og est de consommer une intention ; Quiconque a fait une classe immuable destiné à mettre un état mutable ailleurs. Si vous commencez à muter des instances de cette classe, vous enfreignez probablement l'intention initiale de la conception - et qui sait quelles sont les conséquences.


0 commentaires

0
votes

considère les objets de chaîne, comme exemple. Certaines langues ou bibliothèques de classe fournissent des cordes mutables, certaines ne le font pas.

Un système utilisant des chaînes immuables peut faire certaines optimisations que l'une avec des chaînes mutables ne peut pas. Par exemple, vous pouvez vous assurer qu'il n'y a qu'une seule copie de n'importe quelle chaîne unique. Étant donné que la taille de l'objet "frais de tête" est généralement beaucoup plus petite que la taille de toute chaîne non triviale, il s'agit d'une épargne mémoire potentiellement massive. Il existe d'autres économies d'espace potentielles, telles que les soustractions interne.

Outre les économies de mémoire potentielles, des objets immuables peuvent améliorer l'évolutivité en réduisant la conflit. Si vous avez un grand nombre de threads accédant aux mêmes données, les objets immuables ne nécessitent pas de processus de synchronisation élaborés pour un accès sûr.


0 commentaires

0
votes

juste une autre considération sur le sujet. L'utilisation d'un objet immutable vous permet de les mettre en cache et de ne pas les recréer à chaque fois (c.-à-d. Strings) Cela aide beaucoup sur vos performances de l'application.


0 commentaires


5
votes

Les classes immuables favorisent la prolifération de l'objet, mais si vous souhaitez la sécurité, des objets mutables favoriseront plus em> la prolifération d'objet, car vous devez retourner des copies plutôt que l'original pour empêcher l'utilisateur de changer l'objet que vous revenez. .

Quant à l'utilisation de classes avec toutes les méthodes statiques, ce n'est pas vraiment une option dans la plupart des cas où l'immuabilité pourrait être utilisée. Prenez cet exemple à partir d'un RPG: P>

public class Weapon
{
    final private int attackBonus;
    final private int accuracyBonus;
    final private int range;

    public Weapon(int attackBonus, int accuracyBonus, int range)
    {
        this.attackBonus = attackBonus;
        this.accuracyBonus = accuracyBonus;
        this.range = range;
    }

    public int getAttackBonus() { return this.attackBonus; }
    public int getAccuracyBonus() { return this.accuracyBonus; }
    public int getRange() { return this.range; }
}


1 commentaires

Java SE 16 le rend incroyablement plus facile de créer une classe immuable. Vérifiez Stackoverflow.com/a/65976915/10819573



0
votes

Je pense que si vous voulez partager le même objet entre différentes variables, il doit être immuable.

Par exemple: P>

abc


2 commentaires

-1. A = A + "123" construira simplement une nouvelle chaîne (ABC123) et l'affectera à la variable A. String est immuable en ce que vous ne pouvez pas activer la chaîne de 123 en abc - l'objet String n'a aucune option d'attribution. Il convient parfaitement à construire un nouvel objet à cordes sur deux autres.


Eh bien, une nouvelle chaîne a été construite et une volonté dirigera le nouveau "ABC123". La zone de mise au point ici est un "point" sur un nouvel objet. Je n'ai pas dit que "ABC123" était le résultat de la modification de "ABC" existant ni "123".