2009-03-18 7 views
2

Disons que j'ai une classe simple appelée WebsterDictionary qui a une fonction qui peut prendre un mot et renvoyer sa définition. Il y a peut-être une autre fonction qui peut prendre une définition et retourner un mot. La classe est utilisée tout le temps par de nombreux clients.Une classe statique est-elle appropriée lorsque l'état est immuable?

Pour faciliter les recherches, la classe contient une variable membre qui est un dictionnaire en mémoire qui stocke les mots et leurs définitions associées. Supposons que le dictionnaire ne puisse jamais changer une fois qu'il est initialisé - il est constant et ne varie pas d'une instance à l'autre.

Est-ce un bon candidat pour la classe statique? J'ai lu que les classes statiques devraient être sans état ... mais cette classe a l'état (le dictionnaire en mémoire) à droite?

EDIT: Également, si cela devient une classe statique, quand est-ce que j'initialise le dictionnaire car il n'y aurait plus de constructeur? Est-ce que je vérifie si la référence au dictionnaire est nulle à chaque fois que l'une des méthodes statiques est appelée?

Merci.

+0

non ... aucune raison de le rendre unique. transmettez-le simplement à celui qui en a besoin. c'est plus flexible –

Répondre

2

Une classe statique convient lorsque la fonctionnalité n'a pas besoin d'être remplaçable (par exemple pour les tests). Si vous souhaitez utiliser un stub ou un mock, vous devez créer une interface appropriée, puis l'implémenter avec un singleton.

+0

Indépendamment du fait que l'implémentation soit un singleton ou une classe statique, croyez-vous que l'exemple que j'ai fourni ne devrait pas autoriser plusieurs instances puisque l'état ne varierait pas entre les instances? –

+0

Cela dépend s'il y a d'autres raisons pour autoriser plusieurs instances (si cela rend un autre aspect plus facile, par exemple l'injection de dépendance) - mais mon intuition est non, il ne devrait pas. –

0

Vous pouvez soit aller Singleton ou une classe statique. J'irais probablement avec un Singleton mais je pense que c'est surtout un problème de préférence dans cette situation particulière.

0

Une classe statique est appropriée lorsqu'une seule "instance" doit jamais exister, auquel cas le modèle Singleton peut être plus approprié (selon les détails). Pour un objet immuable dont vous aurez besoin de plusieurs instances de, bien sûr, une classe statique est inappropriée.

0

Ce que vous cherchez est peut-être Singleton?

Il n'est pas nécessaire que la classe statique n'ait pas d'état (elle peut contenir des membres statiques, ce qui peut faire partie de son état).

0

Il semble que vous décriviez le Monostate pattern: vous souhaitez que le même WebsterDictionary soit partagé par tout le monde. Il se trouve que le WebsterDictionary est également immuable, mais c'est un problème orthogonal: il est simplement impossible de mettre à jour (par exemple, en utilisant un wrapper en lecture seule).

1

Pour développer les réponses des autres, une classe statique ou un singleton est utile lorsque vous devez avoir une seule instance d'une classe. C'est beaucoup plus facile à accomplir lorsque les données sont immuables. Ainsi, il existe une possibilité qu'une classe statique soit ce que vous voulez utiliser pour cela. Mais ce n'est pas forcément le cas, c'est automatiquement ce que vous voulez utiliser.

Mon conseil est de vous poser une question: le monde s'écroulera-t-il si j'instancie plus d'un de ces objets? Si oui, utilisez un singleton ou une classe statique. Sinon, utilisez une classe régulière.

1

Une classe statique peut être ce que vous voulez ici (voir d'autres réponses). Mais ne faites pas l'erreur d'appeler votre dictionnaire "immuable".

Immuable ne signifie pas « ne peut jamais changer lors de l'exécution » dans le sens que vous avez utilisé l'expression, parce que votre Dictionnaire fait ne changement lors de l'exécution; après que vous devez le créer, vous devez également ajouter les éléments. Même à ce stade, vous pouvez l'intention qu'il ne change plus jamais, mais il est possible pour le changer. Votre intention n'est pas appliquée nulle part.

Un vrai objet immuable ne peut pas changer après la création, peu importe combien vous essayez. Au lieu de cela, lorsque vous avez besoin d'une variation de l'objet, vous devez créer une nouvelle instance avec les attributs souhaités.

Vous pouvez penser à une classe statique dans un sens comme ayant exactement une instance. Ce n'est probablement pas le meilleur choix pour un modèle où vous dépendez de la création de nouvelles instances pour chaque changement d'état.

+0

Si la classe n'expose pas un moyen pour que son état soit modifié, il ne variera pas par instance. Dans ce cas, devrait-il être statique? Si c'est statique, quand le dictionnaire est-il initialisé s'il n'y a pas de constructeur? –

0

Comme vous l'avez dit, la classe conserve une forme d'état global, même si elle est en lecture seule. En adoptant l'approche de Singleton, il est très clair qu'il détient des données. Si vous utilisez l'injection de dépendance, vous pouvez lui injecter des instances singleton, au lieu de faire en sorte que toutes les classes aient du code qui vous donne l'instance. Cela signifie que les autres classes ne seront pas liées à l'approche Singleton, et si vous pouvez plus facilement la remplacer lors des tests (combinée avec une interface pour permettre le remplacement par des tests de simulation).