3 votes

Méthodes statiques dans une classe abstraite ?

J'ai récemment appris dans une vidéo que c'est une bonne pratique de transformer une classe Java en classe abstraite si toutes ses méthodes sont statiques pour des raisons de performance.

Quelqu'un peut-il expliquer pourquoi c'est le cas ?

2voto

Nathan Hughes Points 30377

Ceci est susceptible d'empêcher les gens de créer des instances de la classe. On s'attend à ce que le code Java crée beaucoup d'objets qui ne sont utiles que pendant une courte période et qui sont collectés à la poubelle, il est donc difficile de dire qu'il s'agit d'un gain de performance substantiel. Cela semble plutôt être un moyen de communiquer l'intention derrière une classe.

Une autre solution consiste à rendre la classe finale au lieu de la rendre abstraite. C'est l'approche adoptée dans le code JDK, par exemple, java.lang.Math :

public final class Math {

    /**
     * Don't let anyone instantiate this class.
     */
    private Math() {}

Avec l'une ou l'autre de ces approches, vous devez donner à la classe un constructeur privé. Cela empêche quiconque de l'instancier et indique clairement que le but de la classe est de fournir une maison pour les méthodes statiques. L'inconvénient ici est que les outils de couverture de code ont tendance à signaler que le constructeur est non couvert.

Une troisième solution, à partir de Java 8, consiste à placer les méthodes statiques dans une interface. Toutes les méthodes avec une implémentation qui ne sont pas par défaut sont considérées comme des méthodes statiques. L'avantage de cette approche est qu'il n'y a pas de constructeur à rendre privé, et les outils de couverture de code seront satisfaits.

Avec une classe abstraite (mais sans le constructeur privé), ou une interface, il est également possible d'étendre ou d'implémenter le type pour rendre toutes les méthodes statiques disponibles sans importations statiques. Voir ce lien pour un exemple . Avec l'approche java.lang.Math, ce n'est pas possible.

0voto

Shadi Jumaa Points 166

Vous n'avez pas besoin d'en faire une classe abstraite si elle a des méthodes statiques. Si vous en faites une classe abstraite, personne ne peut instancier cette classe.

D'autre part, vous pouvez déclarer une classe avec un constructeur privé, afin que personne, pas même une sous-classe, ne puisse instancier une instance de votre classe.

 public class A
 {
    private A()
    {
       throw new RuntimeException("Instantiation of MyUtility is not 
       allowed!");
     }

    public static void aMethod()
    {
      // Your method here.
    }
  }

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