2010-09-08 4 views
4

J'ai besoin les fonctionnalités suivantesQuestion de conception: Java Class avec une seule méthode ok?

Given two sorted lists, merge them 

J'ai ce squelette Java code:

public class MergeLists{ 
    public List merge(List l1, List l2){ 
     List l3; 
     // merge l1, l2 in to l3 
     return l3; 
    } 

    public static void main(){ 
     // populate list1 and list2 
     MergeLists ml = new MergeLists(); 
     List l3 = ml.merge(l1,l2); 
    } 
} 

Est-ce une seule classe de méthode, la bonne approche? J'ai l'impression que la classe presque vide me regarde pour dire que c'est un mauvais design. J'ai d'abord eu List L3 en tant que membre privé de MergeLists mais ensuite j'ai pensé, fusion (l1, l2) peut être appelé plusieurs fois avec le même objet, ce qui obligeait l3 à être local pour fusionner (l1, l2). J'ai lu que l'utilisation de la méthode statique est encore pire pour la réutilisation du code. S'il vous plaît donnez votre avis. Je vous remercie.

+1

C'est bon. Mais je prédis qu'une fois que cette classe est dans votre base source, elle commencera à développer d'autres méthodes de façon inattendue. Un jour, vous voulez fusionner plus de deux listes, donc cela développe une méthode pour cela. Ensuite, vous voulez fusionner une liste dans une autre sans en créer une troisième. Ensuite, vous voulez trier puis fusionner des listes. Bientôt, la méthode de fusion n'est pas si solitaire! –

Répondre

3

Dans ce cas, puisque vous avez pas de véritables données membres, ce qui rend la méthode unique une méthode statique dans la classe serait le choix de conception appropriée:

public class ListUtils 
{ 
    public static List Merge(List l1, Listl2) 
    { 
     List l3 = new List(); 
     // merge l1 and l3 into l3 
     return l3; 
    } 
} 

Vous pouvez ensuite utiliser le code sans avoir à créer une instance de votre classe (surtout quand il ne sert à rien):

List l1 = new List(); 
List l2 = new List(); 
// Fill the lists 

List merged = ListUtils.Merge(l1, l2); 
+0

Vous ne pouvez pas avoir de classes statiques de niveau supérieur dans Java. – aioobe

+0

@aioobe - Désolé. Mot-clé obtenu heureux. Fixé. –

+0

Merci Justin et Erick. J'essaie de réconcilier l'approche statique avec la réponse choisie à cette question qui dit essentiellement en utilisant l'électricité statique est une mauvaise idée: http://stackoverflow.com/questions/205689/class-with-single-method-best-approach – snk

4

vous pouvez le faire, mais je pense que vous voulez que la méthode merge être static. Cela vous assurera que vous n'avez pas à l'instancier avant d'appeler la méthode. Vous pouvez simplement faire ceci:

 
List l3 = MergeLists.merge(l1,l2); 

De plus, si cela est la seule méthode et il est statique, vous pouvez faire la classe abstract qui signifie qu'il ne peut pas être instancié.

+3

... ou rendre le constructeur privé – Stroboskop

+0

Il n'y a pas de constructeur. –

+0

Je rends généralement ma classe util finale et ajoute un constructeur privé unique. C'est d'interdire l'instanciation et la dérivation. – gawi

0

Les méthodes statiques ne sont pas nécessairement mauvaises - cela dépend du contexte dans lequel elles sont utilisées. Des exemples du haut de ma tête où cela se produit:

File.separator; // a static representation of the file separator for your platform. 
File.listRoots(); // list root filesystems 

Maintenant, au cas où vous appliquez simplement votre listutils a été déjà couvert (voir d'autres réponses), cependant, vous pourriez faire plus, par exemple:

class SortedList implements List<T> 

Lorsque tous les éléments ajoutés sont triés automatiquement en place - en tant que tel, il ne fait pas de sens pour l'élément à être statique parce que vous voulez que les résultats soient stockés dans ce cas. Si vous essayez cela sous éclipse, vous trouverez que vous devez remplacer quelques méthodes de toute façon, y compris add et addAll qui serait équivalent à un merge. Donc, je dirais que cela dépend de ce que vous faites à long terme et de la façon dont l'objet devrait agir.

0

Énoncé du problème:

Etant donnés deux listes triées, fusionnez

Comment aller sur la conception? - Commencez par analyser l'énoncé du problème. - oh il a "liste" - un nom - oh il a une action "fusion"

  • donc "Merge" ing est une action à faire sur un objet de la liste. donc ça devrait faire partie de List.

  • car il existe une contrainte de langage spécifique Java, dont la bibliothèque a déjà la classe List, besoin de créer un autre my.example.List?

  • Avoir une fusion de la méthode (my.example.List autre liste)

  • myfirstList.merge (mySecondList)

Si vous souhaitez que plusieurs listes à fusionner pour créer une autre nouvelle liste, vous pouvez Concevoir une classe util qui prend var-args MyListUtil {static List getMergedList (Liste ... listOfLists)

Si votre question est "Je veux fusionner deux listes" (ce qui peut ne pas être une question de 'conception'), alors peut-être que la solution serait "utiliser la classe d'utilitaires xyz qui a déjà cette fonctionnalité"