30 lipca 2009

Efektywny programista Java, część 2 - łatwiejsze tworzenie parametryzowanych kolekcji i obiektów

Tym razem spróbujemy ułatwić sobie tworzenie parametryzowanych typów kolekcji i obiektów. Pierwsza myśl jaka nam przychodzi do głowy to po prostu użycie konstruktora:

// ...
List<User> usersList = new ArrayList<User>();

Map<IpAddress, User> ipUsersMap = new HashMap<IpAddress, User>();

// ...

To jeszcze nie są zbyt skomplikowane przykłady, ale jeśli okaże się, że musimy stworzyć Mapę złożoną z obiektu i innej kolekcji:

// ...


Map<IpAddress, List<User>> ipUserMap = new HashMap<IpAddress, List<User>>();
// ...

to pojawia się spora ilość zdublowanego kodu z informacją o typach parametrów po lewej i prawej stronie deklaracji.

Okazuje się, że można tego uniknąć wykorzystując tzw. "wnioskowanie typów". Kompilator będzie wiedział jaki tym parametryzowanej instancji ma zwrócić na podstawie tego, do jakiej zmiennej będziemy chcieli zwracany obiekt przypisać. Wygodnym sposobem jest zebranie wszystkich takich metod w jednej klasie użytkowej:


package pl.tdziurko.effectivejava

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;

/**
*
* @author Tomasz Dziurko
*/
public class Helper {

// Do not instantiate this class, this is utility class
private Helper() { }

public static <E> ArrayList<E> newArrayList() {
return new ArrayList<E>();
}

public static <E,K> HashMap <E,K> newHashMap() {
return new HashMap<E,K>();
}

public static <E> HashSet <E> newHashSet() {
return new HashSet<E>();
}

}


Teraz możemy zobaczyć o ile krótszy i wygodniejszy jest kod stosujący wnioskowanie typów:


// ...
List<User> usersList = new ArrayList<User>();
List<User> usersList2 = Helper.newArrayList();

Map<IpAddress, User> ipUsersMap = new HashMap<IpAddress, User>();
Map<IpAddress, User> ipUsersMap2 = Helper.newHashMap();

Map<IpAddress, List<User>> ipUserMap = new HashMap<IpAddress, List<User>>();
Map<IpAddress, List<User>> ipUserMap2 = Helper.newHashMap();

// ...



Możemy skorzystać z wnioskowania typów również przy tworzeniu parametryzowanych obiektów innych niż kolekcje, ale tutaj zaleta jego użycia jest widoczna najbardziej.

2 komentarze:

  1. Coś takiego jest stworzne w bibliotece google-collections:
    http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Lists.html
    ..i wiele więcej :)

    OdpowiedzUsuń