12
votes

Java: classe de retour (pas une instance)

est-il possible de revenir dans une méthode statique une classe? Je vais expliquer ...

J'ai: xxx

Je veux créer une méthode statique dans les retours de la sorcière B A . Donc, vous pouvez faire: xxx

et xxx

ceci, sans créer d'une instance de A . Il suffit d'utiliser des méthodes statiques.

est-ce possible?


2 commentaires

Lire gbracha.blogspot.com/2008/02/cutting-out- static.html ou apprendre c et utilisez des pointeurs de fonction.


Pas une réponse en tant que telle mais ... Scala utilise des objets Singleton à la place de méthodes statiques (ce qui n'est vraiment pas orienté très objet). Si vous utilisiez Scala, vous avez beaucoup pourrait faire ce genre de chose


9 Réponses :


2
votes

Non, ce n'est pas possible. Vous ne pouvez retourner une référence à une instance d'une classe. Le plus proche que vous puissiez y arriver est de renvoyer une référence à une variable de catégorie de type. La question est: pourquoi voulez-vous cela? Quel problème essayez-vous de résoudre? Il peut y avoir une meilleure solution.


0 commentaires

2
votes

Même si cela serait possible, cela ne sera pas très utile. L'appel a.blah () ne crée pas une instance de A . C'est une méthode statique sans besoin d'une instance.

Et vous ne pouvez pas utiliser les interfaces pour mettre en œuvre des méthodes statiques. Alors, que devrait-il être bon?


0 commentaires

6
votes

Non, cela n'est pas possible. Vous avez deux options:

  1. b.geta () retourne une instance de A, et bla () sera un non-statique Méthode.

  2. appelez directement a.blah () .


1 commentaires

Possible, mais pas recommandé. Voir cette réponse Stackoverflow.com / Questions / 1932625 / ...



1
votes

Si vous ne voulez pas avoir une instance de A code>, alors laissez b code> appel bla () code> directement. I.e.

class B { 
    void blah() { 
        A.blah();
    } 
}


0 commentaires

6
votes

Je vais deviner que la raison pour laquelle vous demandez est que vous voulez que B de renvoie de nombreuses classes différentes avec des comportements différents - pas seulement A.

Vous voulez probablement utiliser une interface pour ce que vous faites à la place. . P>

interface IA {
  void blah();
}

public class B {
  IA getA1() {
     return new IA {
        void blah() {
           ...code...
        }
     }
  }
  IA getA2() {
     ...
  }
  IA getA3() {
     ...
  }
}

myCallingMethod {
   B.getA1().blah();
   B.getA2().blah();
   B.getA3().blah();
}


0 commentaires

0
votes

Vous pouvez retourner une méthode à l'aide de la réflexion que vous pouvez invoquer () plus tard. Cependant, on dirait que vous essayez de faire quelque chose qui devrait être fait d'une autre manière. Pourquoi essayez-vous de faire cela?


0 commentaires

4
votes

Les gens disent que c'est impossible, et c'est genre de vrai, mais si vous utilisez l'API de réflexion, vous pouvez faire quelque chose près de cela.

Voici comment vous pourriez le faire.

Vous avez une classe qui fait cela. xxx

puis pour appeler bla vous faites: xxx

Alors, pourquoi voudriez-vous faire cela? Eh bien, si vous le faites de cette façon, vous pouvez modifier la classe A à Geta () pourrait retourner A, B, C ou D, tous avec des fonctions de Blah () différentes. Je ne suis pas vraiment sûr de ce que cela servirait, mais si vous voulez le faire, vous le pouvez.

Voir: classe.gedeclaredmethod () et méthode.invoke () pour plus d'informations. < P> Je n'ai pas essayé cela, vous devrez peut-être faire quelque chose de peaufiner.


0 commentaires

1
votes
B.getA();
A.blah();

3 commentaires

+1 pour trouver cette échappatoire en Java. -1 pour ne pas jeter un mot de prudence que cela ne devrait pas être fait. BTW, Eclipse génère cet avertissement lors de la compilation de ce code la méthode statique BLAH () à partir du type A doit être consulté de manière statique .


org.apache.commons.cli.OptionBuilder Utilise ce modèle anti-motif de méthodes statiques appelantes sur les instances retournées.


Ce n'est pas une échappatoire en Java. C'est juste un exemple qui ne fait pas ce que vous pensez que cela fait. Voir ma réponse.



8
votes

Il s'agit d'une réfutation de la réponse de @ irreputable: xxx

il "fonctionne", mais probablement pas dans le sens que vous attendez, et certainement pas de manière utile. Casser cela en deux parties: xxx

La première instruction renvoie une instance (null dans cette affaire) de A et la deuxième instruction ignore cette instance et appelant a.blah () . Donc, ces affirmations sont réellement équivalentes à xxx

ou (étant donné que getta () est libre de côté), tout simplement xxx

et voici un exemple qui l'illustre plus clairement: xxx

... et cela (j'espère) illustre pourquoi cette approche n'a pas 't résoudre le problème de l'OP.


0 commentaires