8
votes

Java - constructeur privé vs final et plus

Supposons qu'il existe une classe avec tous ses constructeurs déclarés comme privés.

EG.: P>

public class That extends This {
    That () {..} 
    ...
}


0 commentaires

3 Réponses :


1
votes

de ce que je connais l'utilisation générale d'un constructeur code> code> est pour vous assurer que la construction d'objets est effectuée via certains autres moyens, c'est-à-dire une méthode statique. Par exemple:

public class Something {

    private Something() { }

    public static Something createSomething() {
        Something ret = new Something();
        // configure ret in some specific way
        return ret;
    }

}


3 commentaires

Oui, c'est plus ou moins ce que Singleton fait - avec l'ajout d'un drapeau, qu'il soit déjà instancié lui-même. S'il y avait un moyen de se déplacer, je pourrais apporter des appels explicites à certaines des méthodes non statiques de Java.Lang.Runtime. mais bien d'être vrai.


..et, les messages Eclipse sont trompeurs. Comme je l'ai mentionné dans mon Q.


Suivi. Sur les msgs Eclipse, le compilateur ne tient probablement pas compte du fait que vous marquez tous les constructeurs comme privés - il s'agit simplement de dire que celui que vous essayez d'invoquer ne fonctionnera pas (ainsi "invoquer un autre"). En outre, dans l'ensemble, je ne reçois toujours pas quel problème vous essayez de résoudre. Plusieurs messages ici ont clairement répondu à la différence entre une classe finale et des constructeurs privés, mais je ne sais pas que vous avez articulé la question de haut niveau (modèle de conception) que vous essayez de résoudre (pourrait faire l'objet d'un poste différent ).



24
votes

Vous déclarez une classe finale contre son constructeur privé pour différentes raisons:

  • Vous faites de la classe finale pour indiquer que la classe n'est pas conçue pour l'héritage.
  • Vous faites tous les constructeurs privé pour donner le contrôle de la classe sur son instanciation.

    En d'autres termes, en utilisant final contrôle héritage, lors de l'utilisation d'une instanciation de contrôle Constructeurs privé

    Notez que déclarer des constructeurs privé désactive l'héritage uniquement de l'extérieur. À l'intérieur de la classe, vous pouvez toujours le hériter avec une classe dérivée nommée ou anonyme.

    Lorsque vous faites tous les constructeurs de la classe privé , vous avez besoin d'une méthode statique publique pour rendre la classe utilisable. Un type commun de méthode statique est la méthode d'usine: vous pouvez laisser les utilisateurs de votre classe à appeler des constructeurs privés indirectement via une méthode statique publique.


0 commentaires

4
votes

Une classe avec des constructeurs privés ne peut être instanciée à l'exception du formulaire à l'intérieur de la même classe. Cela rend inutile (possible, mais ne compilera pas) de l'étendre de la classe Antoher.

Cela ne signifie pas qu'il ne peut pas être sous-classé du tout, par exemple parmi les classes intérieures, vous pouvez étendre et appeler le constructeur privé.


2 commentaires

Bon point, mais la dernière déclaration était un peu trouble. Vous pouvez sous-classer la classe, mais ne pas appeler le constructeur privé de la sous-classe. C'est privé, non protégé. Mais oui. Si vous avez une classe intérieure à l'intérieur de la classe d'origine avec constructeur privé, vous pouvez appeler le constructeur privé de la classe d'origine. Je ne sais pas ce que c'est pour, mais c'est légal.


La hiérarchie est, plus ou moins, paquet -> classe -> classes intérieures. Ce qui est privé pour la classe, est accessible aux classes intérieures. Vous pouvez déclarer une classe interne abstraite avec constructeur privé et quelques sous-classes intérieures et utilisez-les à l'intérieur de la classe principale. Ce n'est pas la chose la plus utile au monde, mais si vous avez envie de le faire, vous le pouvez.