2009-01-26 8 views

Répondre

10

Ils vous permettent de sortir la logique de la classe parente et de l'objectiver. Cela supprime la fonctionnalité d'où elle n'appartient pas et la place dans sa propre classe. Mais que se passe-t-il si ce nouvel objet n'est nécessaire que pour une courte durée, seulement pour la durée d'un seul bloc de code? Eh bien, c'est là qu'intervient une classe locale.

+2

Ce n'est pas tellement la durée de l'instance d'objet, mais sa portée. Si la classe doit uniquement être visible par la classe parente, la rendre locale l'empêchera d'être utilisée ailleurs. En outre, la classe locale peut voir les membres privés du parent - une classe non locale ne peut pas le faire. – belugabob

+7

@belugabob: 1. Les classes locales ne peuvent être utilisées qu'à l'intérieur de la méthode ou du constructeur dans lequel elles sont définies. Ils ne sont même pas visibles à la classe qui les entoure. 2. Les classes imbriquées/internes peuvent également voir les variables privées de la classe englobante. –

24

Voici un exemple de la façon dont une classe interne anonyme, une classe interne locale et une classe interne régulière peuvent être présentes dans un programme. L'exemple examine une méthode myMethod et une classe InnerClass présente dans la classe MyClass. Par souci de discussion, ces cours seront tous implémentant l'interface Runnable:

public class MyClass 
{ 
    public void myMethod() 
    { 
     // Anonymous inner class   
     Runnable r = new Runnable() { 
      public void run() {} 
     }; 

     // Local inner class 
     class LocalClass implements Runnable 
     { 
      public void run() {} 
     } 
    } 

    // ... // 

    // Inner class 
    class InnerClass implements Runnable 
    { 
     public void run() {} 
    } 
} 

La anonyme classe interne peut être utilisé simplement pour faire une classe qui implémente Runnable sans avoir à écrire la classe et le nommant, et comme krosenvold mentionné dans son post, il est utilisé comme une «fermeture de pauvre» en Java.

Par exemple, un moyen très simple pour démarrer une Thread en utilisant une classe interne anonyme serait:

new Thread(new Runnable() { 
    public void run() 
    { 
     // do stuff 
    } 
}).start(); 

Une classe interne locale peut être utilisé pour faire une classe qui se trouve dans la portée locale - il ne sera pas accessible à partir d'autres méthodes en dehors de myMethod.

S'il y avait une autre méthode et nous avons essayé de faire une instance de la LocalClass qui est situé à l'intérieur de la méthode myMethod, nous ne serons pas en mesure de le faire:

public void anotherMethod() 
{ 
    // LocalClass is out of scope, so it won't be found, 
    // therefore can't instantiate. 
    new Thread(new LocalClass()).start(); 
} 

Une classe interne est partie de la classe dans laquelle se trouve la classe interne. Ainsi, par exemple, la classe interne InnerClass est accessible à partir d'autres classes par MyClass.InnerClass. Bien sûr, cela signifie également qu'une autre méthode de MyClass peut aussi instancier une classe interne.

public void anotherMethod() 
{ 
    // InnerClass is part of this MyClass. Perfectly instantiable. 
    new Thread(new InnerClass()).start(); 
} 

Une autre chose au sujet de la classe interne anonyme et la classe interne locale est qu'il sera en mesure d'accéder final variables qui sont déclarées dans le myMethod:

public void myMethod() 
{ 
    // Variable to access from anonymous and local inner classes. 
    final int myNumber = 42; 

    // Anonymous inner class   
    Runnable r = new Runnable() { 
     public void run() 
     { 
      System.out.println(myNumber); // Works 
     } 
    }; 

    // Local inner class 
    class LocalClass implements Runnable 
    { 
     public void run() 
     { 
      System.out.println(myNumber); // Works 
     } 
    } 

    // ... // 

Alors, quels sont les avantages? L'utilisation de classes internes anonymes et de classes internes locales au lieu d'avoir une classe ou une classe interne complète distincte permet aux premiers d'avoir accès aux variables final dans la méthode dans laquelle ils sont déclarés, et en même temps, les classes sont locales à la méthode elle-même, donc il ne peut pas être accédé à partir de classes extérieures et d'autres méthodes au sein de la même classe.

12

Il y a un certain nombre de choses que vous pouvez faire avec les classes locales que vous n'obtenez pas avec les classes internes anonymes.

  • parce que le type a un nom, vous pouvez plus ajouter utilement les membres non dans le supertype
  • un nom donné peut faire pile trace plus facile à suivre (en particulier pour les objets de verrouillage)
  • sous-type
  • plus d'une base de type
  • construction dans plus d'un endroit, et plusieurs constructeurs

d'autre part, ils font une syntaxe affreusement bavard même messier.

+0

# 2 et # 3 sont les seules raisons pour lesquelles je les ai utilisées personnellement. –

+0

(si ce n'est pas la même chose que # 1) Comme ils ont des noms, vous pouvez les utiliser à plusieurs reprises. De plus, le point 3 est bon. –

Questions connexes