J'ai une classe UserEntity qui implémente l'interface IUserEntity.

Dans la classe UserEntity, j'ai une carte statique:

private static Map<IUserEntity.IIdentifiable, IUserEntity> staticUserEntityMap = new HashMap<>();

Dans l'interface IUserEntity, j'aimerais écrire une méthode comme celle-ci:

public Collection<IUserEntity>      getUsers();

Et dans la classe:

public static Collection<IUserEntity> getUsers(){
    return staticUserEntityMap.values();
}

Mais je ne peux pas déclarer de méthodes statiques dans l'interface et je ne peux pas changer la signature de méthode dans la classe UserEntity.

Comment puis-je faire ceci ?

1
Maxime Gajovski 26 déc. 2015 à 16:29

3 réponses

Meilleure réponse

Dans Java 8, vous pouvez avoir des implémentations par défaut dans l'interface, mais je pense que cela ne résoudra pas votre problème. Au lieu de modifier les signatures de méthode, vous pouvez créer une méthode statique distincte et l'appeler avec le nom de classe dans l'implémentation getUsers. par exemple.

Créer une nouvelle méthode:

public static Collection<IUserEntity> getUsersStatic() {
   return staticUserEntityMap.values();
}

Appelez cette méthode depuis getUsers:

public Collection<IUserEntity>      getUsers() {
  return UserEntity.getUsersStatic();
}
3
Gaël J 26 déc. 2015 à 14:09

Je vous renvoie à cette question, et la documentation:

En plus des méthodes par défaut, vous pouvez définir des méthodes statiques dans les interfaces. (Une méthode statique est une méthode associée à la classe dans laquelle elle est définie plutôt qu'à n'importe quel objet. Chaque instance de la classe partage ses méthodes statiques.) Cela vous permet d'organiser plus facilement les méthodes d'assistance dans vos bibliothèques; vous pouvez conserver les méthodes statiques spécifiques à une interface dans la même interface plutôt que dans une classe distincte.

Cependant, vous pouvez également implémenter le champ dans l'interface, car cela vous permettrait d'implémenter votre méthode statique simple. L'inconvénient serait que la carte deviendrait publique. Cela ressemblerait à ceci:

public interface  IUserEntity {
// ...

 static Map<IUserEntity.IIdentifiable, IUserEntity> staticUserEntityMap = new HashMap<>();

 static Collection<IUserEntity> getUsers(){
   return staticUserEntityMap.values();
 }
}
2
Community 23 mai 2017 à 12:04

Vous pouvez créer une classe abstraite SkeletonUserEntity (ou AbstractUserEntity) dans laquelle vous définiriez cette méthode getUser et toutes les autres méthodes générales. Toutes les classes doivent implémenter IUserEntity que vous étendez à partir de SkeletonUserEntity

0
Serhii Soboliev 26 déc. 2015 à 13:42