2017-09-14 1 views
2

Je souhaite créer une fonctionnalité commune à plusieurs classes. SO j'ai 2 approches. 1) Créer une nouvelle classe et avoir une méthode statique. 2) Créer une nouvelle interface et avoir une méthode statique concrète dedans. Est-ce que quelqu'un peut expliquer la différence en ce qui concerne la performance de ces deux approches? Veuillez tenir compte de l'impact de la mémoire et du traitement.Impact sur les performances de la classe Chargement de l'interface VS Chargement en Java 8

Quelle approche devrais-je choisir et pourquoi?

+1

'Créer une nouvelle méthode et avoir une méthode statique concrète dedans? quelle? – Eugene

+0

Je suppose que vous voulez dire "2) Créer une nouvelle ** interface ** et avoir une méthode statique concrète". Dans ce cas, il n'y a pas de raison pour qu'il y ait une différence de performance notable. – Holger

+0

Correction de la question. Merci Eugene et Holger. –

Répondre

1

Performance sage cela ne devrait pas importer, ce qui signifie que même si c'est le cas, il serait extrêmement petit; cela ne devrait donc jamais conduire votre décision. D'autre part, la définition d'une interface avec une méthode statique qui est uniquement utilisée pour le code commun est une grande odeur de code IMO. les méthodes statiques dans les interfaces sont généralement définies de sorte qu'elles renvoient une instance de cette interface; J'ai tendance à les considérer comme des méthodes d'usine statiques qui habituellement cas de retour d'eux-mêmes, comme Predicate#isEqual:

static <T> Predicate<T> isEqual(Object targetRef) { 
    return (null == targetRef) 
      ? Objects::isNull 
      : object -> targetRef.equals(object); 
} 

plus qu'un but d'interface doit encore être étendue, si vous écrivez une méthode statique simple, à l'intérieur, vous êtes en quelque sorte de casser cette règle.

Un autre problème est que lorsque vous définissez une méthode statique dans une interface, les classes qui étendent cette interface ne peuvent pas utiliser cette méthode. Contrairement aux méthodes par défaut par exemple. Donc, si vous avez une interface:

interface Test { 
    public static String test() { 
     return ""; 
    } 

    public default String testAgain() { 
     return ""; 
    } 
} 

Et une classe TestImpl qui étend cette interface, que:

TestImpl ti = new TestImpl(); 
ti.testAgain(); 
ti.test(); // will not compile 

Alors peut-être vous pouvez utiliser une méthode par défaut au lieu de statique. Je privilégie parfois cela parce qu'il maintient le code plus près de l'endroit où j'en ai besoin: si une certaine classe implémente une interface avec un default method - le code est là, je n'ai pas besoin d'utiliser une classe externe. Par contre, les classes d'utilité statiques sont présentes partout sur le jdk par exemple, comme Collections, Streams ou Spliterators et c'est ce que j'utiliserais si j'étais à votre place.