Emulation d'énumérations extensibles à l'aide d'interfaces

Donc ici, j'essayais cet exercice "Effective Java 2nd edition" sur l'écriture d'énumérations extensibles.

J'ai cependant fait face à un problème vraiment étrange: chaque instance d'enum implémente les méthodes d'interface et tout semblait bien dans eclipse. Mais quand j'ai essayé de le compiler à travers maven, ça a échoué, bien qu'éclipse n'ait pas du tout jeté d'erreur de compilation (mes deux eclipse et maven utilisent le même JDK: 1.6.0_33-b05 ). Il s'est avéré que je devais remplacer la (les) méthode (s) d'interface [Je l'appellerai méthode X à partir de maintenant] à l'intérieur de l'énumération (en dehors de toutes les instances enum) pour corriger cela!

Here's a sample explaining this:

Interface:

public interface IDay
{
  public boolean isHoliday(); 
}

Enum:

public enum Day implements IDay
{
  SATURDAY
  {
    @Override
    public boolean isHoliday()
    {
      return true;
    }
  },
  SUNDAY
  {
    @Override
    public boolean isHoliday()
    {
      return true;
    }
  },
  MONDAY
  {
    @Override
    public boolean isHoliday()
    {
      return false;
    }
  };

 //Method X: the project won't compile for me without this method!
  public boolean isHoliday()
  {
    return false;
  }

}

Invocation:

public class DayTester
{
  public static void main(final String[] args)
  {
   //line Y: this line won't maven compile if I got rid of the method X
    System.out.println("Sunday: " + Day.SUNDAY.isHoliday());
  }
}

Étrangement, eclipse était complètement ok sans la méthode 'X' mais la compilation maven échouait sur la ligne Y en disant

[ERROR] Échec de l'exécution de l'objectif   org.apache.maven.plugins: maven-compiler-plugin: 2.3.2: compile   (default-compile) sur le projet X: Echec de compilation   [ERREUR] DayTester.java:[7,46] ne peut pas trouver le symbole [ERROR]:   Méthode isHoliday() [ERREUR] emplacement: classe Jour

Et mes actions de sauvegarde d'éclipse insèrent automatiquement @Override si j'avais la méthode X en place. Enlever la méthode X jette les erreurs de compilation dans mon éclipse sur les annotations de remplacement précédentes.

Voici mes questions: 1. Pourquoi maven ne compilera-t-il pas dans ce cas quand eclipse le fait? 2. Que signifient les erreurs d'annotation Override ici? 3. La méthode X est-elle même accessible d'une manière ou d'une autre? Qu'est-ce qui me manque pour comprendre?

2
version jdk: 1.6.0_33-b05. Mise à jour maintenant sur le OP aussi.
ajouté l'auteur mystarrocks, source
Je doute que ce soit le cas cependant. Un code totalement différent avec une structure de classe similaire présente le même comportement sur plusieurs PC.
ajouté l'auteur mystarrocks, source
pourrait être un problème d'encodage étrange que eclipse et javac voient des caractères différents.
ajouté l'auteur ZhongYu, source
Quelle version de JDK utilisez-vous?
ajouté l'auteur MariuszS, source
Je pense que maven utilise une version différente de source de langage Java que Eclipse. javac param source signifie "Fournir la compatibilité de la source avec la version spécifiée"
ajouté l'auteur MariuszS, source

1 Réponses

@Override annotation

@Override - Vérifie que la méthode est une substitution. Provoque une erreur de compilation si la méthode n'est pas trouvée dans l'une des classes parentes ou dans l'interface implémentée

Configuration Eclipse

Properties > Java Compiler > Compiler compliance level = 1.6

Vérifiez également niveau de conformité du compilateur au niveau du projet.

Properties > Java Compiler > Errors/Warnings

L'annotation @Override se trouve sous Annotations et est ignorée par défaut.

Configuration de Maven

Add this properties to pom.xml


   1.6
   1.6

This is issued by maven-compile-plugin

    

Notez que le paramètre source par défaut est 1.5 et que le paramètre par défaut est 1.5, indépendamment du JDK avec lequel vous exécutez Maven. Si vous voulez changer ces valeurs par défaut, vous devez définir la source et la cible comme décrit dans Définition de la source et du ciblage du compilateur Java .

  

Lire la suite

0
ajouté
L'échec de la compilation à la ligne Y est la principale préoccupation que j'essaie de comprendre ici. Désolé si je n'étais pas clair à ce sujet. Quoi qu'il en soit, je définis les paramètres source et cible pour voir si le problème d'annulation d'annotation a disparu. EDIT: et l'erreur d'annulation d'annotation a été signalée dans l'éclipse elle-même, et non lors de la compilation via maven.
ajouté l'auteur mystarrocks, source
Si vous voulez dire le niveau de conformité du compilateur, il est défini sur 1.6
ajouté l'auteur mystarrocks, source
Oui. Plusieurs fois aussi. Frapper F3/Ctrl + clic sur la ligne Y m'amènerait à la définition de la méthode sur l'interface aussi! Il est reproductible sur un PC différent avec des paramètres similaires btw.
ajouté l'auteur mystarrocks, source
Si je comprends bien, ce paramètre est uniquement pour les annotations de remplacement manquantes. Ce qui je pense n'est pas pertinent au problème en main?
ajouté l'auteur mystarrocks, source
Et quel niveau de source est configuré dans Eclipse? stackoverflow.com/questions/1736730/…
ajouté l'auteur MariuszS, source
Le projet est rafraîchi et reconstruit?
ajouté l'auteur MariuszS, source
Vérifiez Propriétés> Compilateur Java> Erreurs/Avertissements @Override
ajouté l'auteur MariuszS, source
ajouté l'auteur MariuszS, source