Meffert IT Consulting

JUnit Profi Tipps


JUnit Profi-Tipps kaufen

Weitere Ressourcen

Singleton testen

Jakarta Commons Collections

Iterator testen

GoF-Entwurfsmusterbuch

Erzeugungsmuster

Das Entwurfsmuster Fewton

Das Entwurfsmuster Fewton ist eine Variante des bekannten Singleton. Während das Singleton sicherstellt, dass genau eine Objektinstanz existiert, lässt das Fewton mehrere Instanzen zu. Die Obergrenze wird entweder vorher oder dynamisch festgelegt, typischerweise jedoch zur Entwurfszeit (ansonsten könnte es zu konzeptionellen Schwierigkeiten kommen, wenn die aktuelle Instanzenzahl der Fewton-Klasse höher ist als die nach dynamischem Festsetzen erlaubte).

Kernstück dieses Erzeugungsmusters ist ein Datencontainer, der auf eine maximale Anzahl an Elementen begrenzt ist. Man kann einen solchen Container selbst implementieren oder auf vorhandenen Bibliotheken, wie die Jakarta Commons Collections zurückgreifen. Ein Fewton für maximal 20 Objektinstanzen könnte etwa so implementiert werden:

import java.util.*;
public class FewtonClass {
  private static Vector instances;
  private int index;
  private final static int MAXINSTANCES = 20;

   private FewtonClass() {
    instances = new Vector();
  };
   public static FewtonClass getInstance() {
    if (instances.size() < MAXINSTANCES) {
 
    FewtonClass instance = new FewtonClass();
      instances.add(instance);
      return instance;
    }
    else {

      FewtonClass instance = instances.get(index++);
      if (index >=
MAXINSTANCES) {
        index = 0;
      }
      return instance;
    }
   }
}

Listing 1: Implementierung des Fewtons

Ein Beispiel für den Einsatz des Fewton: Eine Klasse ServerClass nimmt Anfragen von Clients entgegen, etwa über HTTP. Es kann mehrere Instanzen von ServerClass geben, dann nämlich bedient jede ServerClass andere Clients (Stichwort Load-Balancing, wobei diese Bezeichnung hier nur bedingt zutrifft). Nach erzeugen von beispielsweise 20 ServerClass-Instanzen werden nur noch bestehende Instanzen verwendet (recycelt). Das kann damit begründet werden, dass mehr als 20 Instanzen in diesem Beispiel als kontraproduktiv angesehen werden (etwa weil viele Prozesse von einer Einprozessormaschine nicht effizient verwaltet werden können).

Das Fewton testen

Das Fewton verhält sich analog zum Singleton, wenn die maximale Instanzzahl eins beträgt. Auch für die erste angeforderte Instanz muss diese Analogie gelten. Demnach ist der folgende Test auf jeden Fall sinnvoll, wenn auch nicht vollständig:

public void testFewton() {
 
MyClass myObj1 = MyClass.getInstance();
 
MyClass myObj2 = MyClass.getInstance();
 
assertSame(myObj1, myObj2);
}

Listing 2: Teilweiser Test eines Fewtons

Der weitergehende Test, nämlich wenn die maximale Anzahl an Instanzen oder mehr vom Fewton angefordert wird, gestaltet sich etwas umfangreicher:

public void testFewton2() {
  Vector instances = new Vector();
  for (int i=0;i<20;i++) {
    FewtonClass instance = FewtonClass.getInstance();
    assertFalse(inList(instance, instances));
    instances.add(instance);
  }
  for (int i=0;i<5;i++) { //5 ist willkürlich
    FewtonClass instance = FewtonClass.getInstance();
    asserttrue(inList(instance, instances));
}

Listing 3: Vollständiger Test des Fewtons

Die in Listing 3 verwendete Methode inList(Object, List) ist nicht angegeben, sie prüft einfach, ob in der Liste (im Listing ist das die Variable instances) ein bestimmtes Objekt (im Listing instance) enthalten ist. Die ersten 20 Male muss das Fewton unterschiedliche Instanzen zurückliefern, danach immer welche, die zuvor schon erzeugt wurden. Daher auch die zweite Schleife, die fünfmal durchlaufen wird und letzteres prüft. Sie könnte auch nur ein- oder stattdessen fünfzig Mal ausgeführt werden, das spielt keine große Rolle.

Es sind auch andere Fewton-Varianten denkbar. So etwa ein Fewton, das - ähnlich einer Singleton-Registry - eine Instanz pro unterschiedlichem Eingabeparameter in Methode getInstance(Object) zurückgibt. Dieser zusätzliche Eingabeparameter unterscheidet das Fewton erheblich vom Singleton, weil für das Singleton keine Erzeugungsparameter zugelassen sind .