En général, est-il avantageux de déclarer une classe privée statique?
Dans quels cas pourrais-je utiliser l'un des éléments suivants plutôt que l'autre?
private static class Foo
{
...
}
contre
private class Foo
{
...
}
Je pense que c’est un bon point de départ: http://Java67.blogspot.fi/2012/10/nested-class-Java-static-vs-non-static-inner.html
1) La classe statique imbriquée n'a pas besoin de la référence de la classe extérieure mais non La classe imbriquée statique ou la classe Inner nécessite une référence de classe externe. Vous ne peut pas créer d’instance de classe Inner sans créer d’instance de Classe extérieure. C’est de loin la chose la plus importante à considérer pendant que rendant une classe imbriquée statique ou non statique.
2) la classe statique est en fait un membre statique de la classe et peut être utilisée dans contexte statique, par exemple méthode statique ou bloc statique de la classe Outer.
3) Une autre différence entre les classes imbriquées statiques et non statiques est que vous ne pouvez pas accéder à des membres non statiques, par exemple méthode et champ en classe statique imbriquée directement. Si vous le faites, vous obtiendrez une erreur du type "un membre statique Ne peut pas être utilisé dans un contexte statique". En classe intérieure peut accéder aux membres statiques et non statiques de la classe Outer.
Si vous avez besoin d'accéder aux variables/méthodes membres de la classe englobante, utilisez le formulaire non statique. Sinon, utilisez la forme statique.
Je suppose que vous faites référence aux classes intérieures.
Je pense que la motivation viendrait de la façon dont vous voulez associer votre classe intérieure. Si vous souhaitez que votre classe interne soit associée à une instance spécifique de sa classe externe, utilisez private class
, sinon utilisez private static class
.
Je l'ai trouvé utile d'avoir une exception spécifique dans une classe abstraite générique. C'est à dire.:
public abstract class AbstractClass <T>
{
private void doSomethingOrThrowException() throws SpecificException
{
....
if ( ! successful)
{
throw new SpecificException();
}
}
private static class SpecificException extends Exception {}
}
Si je devais laisser de côté la statique, le compilateur me donnerait une erreur qui dit: The generic class AbstractClass<T>.SpecificException may not subclass Java.lang.Throwable