groovy appel méthode privée dans la classe super Java

j'ai une classe Java abstraite MyAbstractClass avec une méthode privée. Il y a une mise en œuvre concrète MyConcreteClass .

public class MyAbstractClass {
    private void somePrivateMethod();
}

public class MyConcreteClass extends MyAbstractClass {
      // implementation details
}

dans ma classe d'essai groovy j'ai

class MyAbstractClassTest {

    void myTestMethod() {
        MyAbstractClass mac = new MyConcreteClass()
        mac.somePrivateMethod()
    }
}

j'obtiens une erreur qu'il n'y a pas une telle signature de méthode pour quelqu'unprivatemethod. Je sais que groovy peut appeler des méthodes privées, mais je devine que le problème est que la méthode privée est dans la classe super, pas MyConcreteClass . Est-il possible d'invoquer un privé méthode dans la classe super comme ceci (autre que d'utiliser quelque chose comme PrivateAccessor)?

merci Jeff

4
demandé sur Jeff Storey 2010-05-14 18:03:44

1 réponses

le fait que vous pouvez appeler des méthodes privées est un bug dans le langage Groovy , pas une fonctionnalité. Cependant, je pense que ce bogue a été introduit délibérément comme une forme de compromis lors de la modification du comportement des fermetures.

même si vous pouvez appeler des méthodes privées, vous ne devriez pas, car j'espère qu'un jour ce bogue sera corrigé, et si votre programme s'appuie sur l'appel de méthodes privées, il sera cassé.

Si vous insistez vraiment sur (ab) en utilisant ce comportement non documenté, vous pouvez essayer d'utiliser quelque chose comme ReflectionUtils pour appeler des méthodes privées dans les classes de parents.

une autre solution consiste à fournir une méthode dans la classe béton qui appelle la méthode privée dans la classe mère. Par exemple, le code suivant "fonctionne", mais il repose toujours sur l'accès aux membres privés, ce qui est mauvais

class Parent {
  private foo() {println "foo"}
}

class Child extends Parent {
  public bar() {super.foo()}
}

new Child().bar()
9
répondu Dónal 2010-05-14 16:20:01