2012-11-05 11 views
8

Potrzebuję utworzyć niestandardową klasę, która rozszerza java.util.LinkedHashMap i bierze ciąg znaków jako klucz, a String jako wartość i ma konstruktor no-arg, który wstępnie wypełnia tę mapę Wartości początkowe.Jak rozszerzyć HashMap, aby zezwolić na ciąg, typy łańcuchów

Utknąłem przy pierwszym zadaniu - jak rozszerzyć LinkedHashMap w taki sposób, że zamiast ogólnych argumentów akceptuje tylko?

Próbowałem to (nie działa)

import java.util.LinkedHashMap; 

@SuppressWarnings("serial") 
public class MyMenu<String, String> extends LinkedHashMap<String, String> { 


    public MyMenu(){ 
     this.put("index.jsp", "Home Page"); 
    } 
} 
+0

Zapomniałaś, aby zakończyć ostatnie zdanie. Tak czy inaczej, to nie będzie miało znaczenia, chyba że pokażesz kod, który mógłbyś wypróbować. –

+3

Rozszerzenie LinkedHashMap prawie na pewno jest złym rozwiązaniem. Możesz użyć sparametryzowanej postaci lub użyć kompozycji zamiast dziedziczenia. –

+0

Nie miałbym problemu z kompozycją, ale wtedy potrzebowałbym metody getter do getMap() z mojego obiektu.Chciałem, aby mój obiekt był HashMap, więc byłoby łatwiej używać jsp z jstl – Wil

Odpowiedz

8

Wszystko czego potrzebujesz to:

import java.util.LinkedHashMap; 

@SuppressWarnings("serial") 
public class MyMenu extends LinkedHashMap<String, String> { 

    public MyMenu(){ 
     this.put("index.jsp", "Home Page"); 
    } 
} 

Usuń <String, String> ze swojej nazwy klasy i zadziała. Tworzysz klasę, która rozszerza się o LinkedHashMap<String, String>, więc twoja klasa jest już Map, która przyjmuje String jako klucz i String jako wartość. Jeśli chcesz stworzyć własną klasę rodzajowe to trzeba zrobić tak:

Utwórz klasę do np

public class MyMenu<K, V> { ... } 

a następnie rozszerzyć tę klasę:

public class SomeMyMenu extends MyMenu<String, String> { ... } 

W takim przypadku będziesz musiał określić klucz i wartość dla klasy, aby klasa SomeMyMenu użyła klucza i wartości jako String. Możesz przeczytać więcej o generics here.

Ale bardziej efektywny sposób zrobić to, co chcesz stworzyć jakiś ostateczny klasy i zadeklarować mapę w nim tak:

public static final LinkedHashMap<String, String> MAP = new LinkedHashMap<String, String>() {{ 
    put("index.jsp", "Home Page"); 
}}; 

i uzyskać wartości z korzystaniem mapy:

SomeClass.MAP.get("Some Key"); 
+0

Dzięki. To zadziałało. Nadal chciałbym wyjaśnić, dlaczego nie potrzebuję po MyMenu? Uczę się pracy z lekami generycznymi w Javie i wszelkie dobre wyjaśnienie jest dla mnie bardzo pomocne. – Wil

2

Jeżeli Państwa walki, jak opisujesz, jest właśnie z deklaracją, to chciałbym spróbować czegoś takiego:

class MyCustomizedMap extends LinkedHashMap<String, String> { 
    //... 
} 
1

Spróbuj:

public class MyMap extends LinkedHashMap<String, String> { ... } 
2

można zrobić coś jak poniżej:

public class MyMap extends LinkedHashMap<String,String>{ 
1

Dopóki używasz JDK 1.5 lub wyższy, można użyć rodzajowych i stworzyć LinkedHashMap który przechowuje klucze ciąg i wartości String i zainicjować w następujący sposób:

LinkedHashMap<String, String> myMap = new LinkedHashMap<String, String>() 
{ 
    { 
     put("abc", "xyz"); 
     ... 
    }; 
} 
1

Skład jest lepszym rozwiązaniem niż dziedziczenia w przypadku:

class MyProperties implements Map<String, String> { 

    private Map<String, String> delegatee = new LinkedHashMap<String, String>(); 

    // ... delegate your methods to delegatee 
} 
+1

Kompozycja jest prawie zawsze lepsza niż dziedziczenie. +1 – durron597

+0

Ale nie "zawsze" – R1K0

Powiązane problemy