2011-08-17 1 views
3

Disons que j'ai une interface:Dans Eclipse, comment factoriser implémentation de l'interface anonyme Enum Singleton

public interface Foo{ 
    String bar(int baz); 
} 

maintenant dans un code Java J'ai une implémentation anonyme de cette interface:

Foo foo = new Foo(){ 
    public String bar(int baz){ 
     return String.valueOf(baz); 
    } 
}; 

est-il possible (dans Eclipse) pour factoriser ce au motif de singleton ENUM (effective Java, point 3), comme ceci:

// further up in the same Compilation Unit: 
enum StandardFoo implements Foo{ 
    INSTANCE{ 
     public String bar(int baz){ 
      return String.valueOf(baz); 
     } 
    } 
} 

// ... 
Foo foo = StandardFoo.INSTANCE; 

Ce refactoring est fastidieux à faire à la main et je le fais tout le temps. Y a-t-il un plugin qui fait ça? Ou un truc secret de JDT que je ne connais pas (j'utilise Indigo)?

BTW: Est-ce que l'idée ou NetBeans supportent ce refactoring?

+1

Je suis un peu surpris que vous vous retrouviez à faire cela "tout le temps". Est-ce que Singleton est vraiment ce que tu veux ici, surtout si c'est seulement utilisé dans cette classe? –

+0

@Mark a) une fois que c'est dans cette classe, je peux facilement la refactoriser en une classe supplémentaire si je le souhaite (mais idéalement une solution de refactoring me le demanderait, comme l'assistant "Nouvelle classe ..."). b) Il est logique de programmer de manière légèrement fonctionnelle, par ex. lors de l'utilisation des interfaces 'Function' et' Supplier' de Guava. –

+0

Mais ces choses n'ont absolument pas besoin d'être un singleton. Pourquoi avez-vous besoin de l'appliquer? –

Répondre

1

IDEA prend en charge Structural Search and Replace (Didacticiel), ce qui, je crois, pourrait accélérer le processus pour vous.

+0

Wow , C'est génial.Je ne sais pas si cela aiderait pour ce refactoring particulier et je ne vais certainement pas passer d'Eclipse (principalement à cause du STS), mais je suis impressionné! –

+0

Pour l'anecdote: environ un an plus tard, je suis passé à IntelliJ, et ce fut l'une des principales raisons :-) –

2

Il n'y a aucun moyen.

BTW, il serait plus normal de faire quelque chose comme ceci:

enum StandardFoo implements Foo { 
    INSTANCE1(0), 
    INSTANCE2(5); 

    private final int delta; 

    private StandardFoo(int delta) { 
     this.delta = delta; 
    } 

    public String bar(int baz) { 
     // Simple example to demonstrate using fields in enum methods 
     return String.valueOf(baz + delta); 
    } 
} 

Pour votre information, même si elles sont définies comme « INSTANCE1 (0) », vous parlez toujours à eux comme juste « INSTANCE1 » dans le code ; par exemple, StandardFoo.INSTANCE1.bar(123) etc

Peut-être ajouter un champ privé à l'énumération pour aider à l'implémentation de la méthode, défini via un constructeur (privé).

+0

Cela ne ressemble pas vraiment à un singleton. Vous avez raison, à moins que vous ** fassiez une multiton avec des implémentations différentes de 'bar', il n'y a pas grand chose à" sous-classer "anonymement' StandardFoo'. –

+0

Je ne comprends pas le but de votre exemple. Lorsque vous avez plus d'un élément enum, les valeurs de champ ou les méthodes d'implémentation doivent différer. Sinon, quel est le point d'avoir plus d'un élément en premier lieu? Pour être clair: dans 90% des cas dont je parle, je n'ai besoin que d'un seul item, mais il est assez facile d'en rajouter une fois que l'énumération est là. –

+0

J'ai édité la réponse pour montrer pourquoi cela pouvait avoir du sens. Il présume un partage de logique - tout comme une classe normale lorsque différentes instances ont des valeurs de champs différentes et se comportent différemment à cause de cela – Bohemian

2

Le refactoring "Convertir les classes anonymes en imbriquées" fait partie de l'astuce. Vous devez changer la classe en enum et remplacer l'appel ctor par le singulier enum.

+0

Bonjour Heiko, bienvenue et merci pour votre réponse. Mais, j'en suis conscient et franchement: avec tout ce que je dois faire, ça ne me fait pas perdre du temps comparé à le faire moi-même. –

Questions connexes