web-dev-qa-db-fra.com

Java: classe statique?

J'ai une classe complète de fonctions utilitaires. Instancier une instance de celle-ci n'a aucun sens sémantique, mais je veux quand même appeler ses méthodes. Quelle est la meilleure façon de gérer cela? Classe statique? Abstrait?

128
Nick Heiner

Constructeur privé et méthodes statiques sur une classe marquée comme finale.

160
David Robles

Selon le grand livre "Effective Java" :

Rubrique 4: Imposition de l'instabilité à un constructeur privé

Tenter d'imposer une non-instabilité en faisant un résumé de classe ne fonctionne pas.

Un constructeur par défaut est généré uniquement si une classe ne contient pas de constructeur explicite. Par conséquent, une classe peut être rendue non instanciable en incluant un constructeur privé:

// Noninstantiable utility class
public class UtilityClass
{
    // Suppress default constructor for noninstantiability
    private UtilityClass() {
        throw new AssertionError();
    }
}

Comme le constructeur explicite est privé, il est inaccessible en dehors de la classe. L'assertionError n'est pas strictement requise, mais elle fournit une assurance au cas où le constructeur est appelé par inadvertance depuis la classe. Cela garantit que la classe ne sera jamais instanciée en aucune circonstance. Cet idiome est légèrement contre-intuitif, car le constructeur est fourni expressément pour qu'il ne puisse pas être invoqué. Il est donc sage d'inclure un commentaire, comme indiqué ci-dessus.

Comme effet secondaire, cet idiome empêche également la classe d'être sous-classée. Tous les constructeurs doivent invoquer un constructeur de superclasse, explicitement ou implicitement, et une sous-classe n'aurait aucun constructeur de superclasse accessible à invoquer.

93
David Robles

On dirait que vous avez une classe d’utilité similaire à Java.lang.Math .
L'approche dans cette classe est la classe finale avec constructeur privé et méthodes statiques.

Mais méfiez-vous de ce que cela fait pour la testabilité, je vous recommande de lire cet article
Les méthodes statiques sont fatales à la testabilité

21
crowne

Juste pour nager en amont, les membres statiques et les classes statiques ne participent pas à OO et sont donc pervers. Non, pas pervers, mais sérieusement, je recommanderais une classe régulière avec un motif singleton pour l'accès. Ceci Ainsi, si vous devez modifier le comportement dans tous les cas, ce n’est pas un réoutillage majeur. OO est votre ami :-)

Mon 0,02 $

6
Bennett Dill

commentez les arguments "constructeur privé": allez, les développeurs ne sont pas si stupides; mais ils sont paresseux. créer un objet puis appeler des méthodes statiques? ça n'arrivera pas.

ne perdez pas trop de temps pour vous assurer que votre classe ne peut pas être mal utilisée. Ayez confiance en vos collègues. et il y a toujours un moyen d'abuser de votre classe, peu importe comment vous la protégez. la seule chose qui ne peut pas être mal utilisée est une chose qui est complètement inutile.

3
irreputable
  • Classe finale et constructeur privé (bon mais pas indispensable)
  • Méthodes statiques publiques
2
fastcodejava

Il est inutile de déclarer la classe comme static. Déclarez simplement ses méthodes static et appelez-les à partir du nom de la classe comme d'habitude, comme dans la classe Math de Java.

De plus, même s'il n'est pas strictement nécessaire de rendre le constructeur privé, c'est une bonne idée de le faire. Marquer le constructeur comme étant privé empêche les autres personnes de créer des instances de votre classe, puis d’appeler des méthodes statiques à partir de ces instances. (Ces appels fonctionnent exactement de la même façon en Java, ils sont simplement trompeurs et nuisent à la lisibilité de votre code.)

1
Bill the Lizard