// ...
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.
A to ci ciekawostka :)
OdpowiedzUsuńCoś takiego jest stworzne w bibliotece google-collections:
OdpowiedzUsuńhttp://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Lists.html
..i wiele więcej :)