Quelqu'un peut-il expliquer quel est le modificateur d'accès par défaut pour un constructeur explicite no-arg constructor (et d'autres constructeurs)?
Les constructeurs sont les mêmes que les méthodes à cet égard. Si vous ne donnez pas de public, privé ou protégé explicite, le constructeur obtient la visibilité par défaut du "paquet privé". Il peut être appelé à partir de la même classe ou de toute autre classe du même package, mais pas à partir de sous-classes d'un package différent (ainsi, si une classe ne comporte que des constructeurs visibles par le package, toutes les sous-classes doivent figurer dans le même package).
Un constructeur privé empêche toute instance de other class d'instancier celui-ci, mais vous pouvez avoir une méthode de fabrique statique publique au sein de la classe qui appelle son propre constructeur privé. C'est un modèle courant pour des choses comme les singletons.
Constructeur par défaut de JLS 8.8.9
Si une classe ne contient aucune déclaration de constructeur, un constructeur par défaut ne prenant aucun paramètre est automatiquement fourni:
si la classe est déclarée publique, le constructeur par défaut se voit implicitement attribuer le modificateur d'accès public;
si la classe est déclarée protégée, le constructeur par défaut reçoit implicitement le modificateur d'accès protégé;
si la classe est déclarée privée, le constructeur par défaut se voit implicitement attribuer le modificateur d'accès privé; autrement,
le constructeur par défaut a l'accès par défaut impliqué par aucun modificateur d'accès.
- Une constructor
aura un access-control de type default
lorsque no modificateur d'accès sera défini explicitement. Donc, ce constructeur aura un Package Level Access. Les classes définies dans ce package en tant que celle de la classe avec ce constructeur par défaut pourront y accéder et les classes qui étendent cette classe contenant le constructeur par défaut pourront y accéder via l'héritage.
- Si le constructeur est créé à private
, seul le code de cette classe peut accéder à cela.
Exemple Singleton
public class Test {
private static Test uniqueInstance = new Test();
private Test(){}
public static Test getInstance(){
return uniqueInstance;
}
}
- Même non-statiqueinner classes
avec dans la classe a accès à ses membres privés et vice-versa.
Par exemple:
public class T {
private T(){
System.out.println("Hello");
}
class TT{
public TT(){
new T();
}
}
public static void main(String[] args){
T t = new T();
T.TT i = t.new TT();
}
}
Cela diffère selon que vous écrivez un constructeur pour une classe régulière ou une énumération:
Pour les classes, la réponse est donnée par JLS §6.6.1 :
Un membre de la classe ou un constructeur déclaré sans modificateur d'accès a implicitement accès package.
Pour les énumérations, la réponse est donnée par JLS §8.9.2 :
Dans une déclaration enum, une déclaration de constructeur sans modificateur d'accès est private.
(Les constructeurs Enum sont toujours privés pour empêcher d'autres classes d'instancier plus de constantes enum.)