Erstellen von Hashtable als final in Java

Lesezeit: 3 Minuten

Wie wir wissen, ist der Zweck des Schlüsselworts “final” in Java. Während wir eine Variable als final deklarieren, müssen wir die Variable initialisieren. wie “final int a=10;”
Wir können den Wert von “a” nicht ändern. Aber wenn wir uns für HashTable entscheiden, ist es möglich, einen gewissen Wert hinzuzufügen, sogar indem wir die HashTable als endgültig deklarieren.

Beispiel::

 private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>() 
{{     put("foo",      1);     
       put("bar",      256);     
       put("data",     3);     
       put("moredata", 27);     
       put("hello",    32);     
       put("world",    65536);  }}; 

Jetzt erkläre ich die MYHASH HashTable als final. Wenn ich versuche, dem noch weitere Elemente hinzuzufügen, akzeptiere ich es.

MYHASH.put("NEW DATA",      256);

Nun werden die „NEW DATA“ zur HashTable hinzugefügt. Meine Fragen sind, warum es erlaubt ist, sogar seine Deklaration als endgültig hinzuzufügen????

  • Beachten Sie, ob der Inhalt der Karte veränderlich war (java.util.Date oder java.awt.Pointsagen wir) dann ist es immer noch änderbar.

    – Tom Hawtin – Angelleine

    3. November 2011 um 15:27 Uhr

Joes Benutzeravatar
Jo

Denn final markiert die Referenz, nicht das Objekt. Sie können diesen Referenzpunkt nicht auf eine andere Hash-Tabelle setzen. Aber Sie können mit diesem Objekt alles machen, einschließlich Dinge hinzufügen und entfernen.

Ihr Beispiel für eine int ist ein primitiver Typ, keine Referenz. Final bedeutet, dass Sie den Wert der Variablen nicht ändern können. Also mit einem int Sie können den Wert der Variablen nicht ändern, z. B. den Wert von ändern int anders. Bei einer Objektreferenz können Sie den Wert der Referenz, dh auf welches Objekt sie zeigt, nicht ändern.

Vlads Benutzeravatar
Vlad

Sie können verwenden Collections.unmodifiableMap um einen nicht modifizierbaren Wrapper über Ihre Hash-Tabelle zu bekommen.

Beispiel:

import java.util.*;
class Test{

    public static final Map<String,Integer> MYHASH;
    static{
        Hashtable<String,Integer> tmp = 
            new Hashtable<String,Integer>();
        tmp.put("A",65);
        tmp.put("C",67);
        MYHASH = Collections.unmodifiableMap(tmp);
    }

    public static void main(String[] args){

        System.out.println(MYHASH.get("A"));

        //this will throw
        //java.lang.UnsupportedOperationException
        MYHASH.put("B",66);    

    }

}

  • Sie erhalten meine +1, weil Sie eindeutig nicht dafür sorgen, dass die veränderbare Version der Karte versehentlich mutiert wird. Hätte es vorgezogen, das unveränderliche Statik beizubehalten private. Auch kein Verwendungszweck Hashtable.

    – Tom Hawtin – Angelleine

    3. November 2011 um 15:25 Uhr

  • Vielen Dank! ich ging mit Hashtable für Konsistenz mit der Frage, aber ich hatte das nicht bemerkt private.

    – Vlad

    3. November 2011 um 19:21 Uhr

Nur die Referenz ist endgültig, ihre Methoden können natürlich genauso wie bei einer nicht-finalen Referenz aufgerufen werden.

Verwenden Collections.unmodifiableMap(map) um eine Karte unveränderbar zu machen.

Versuchen Sie und wickeln Sie Ihre ein Hashtable mit einer nicht modifizierbaren Karte mit Collections.unmodifiableMap( MYHASH ). Dies sollte Ausnahmen auslösen, wenn Sie versuchen, etwas in der Karte zu ändern, dh Einträge hinzuzufügen oder zu entfernen. (Beachten Sie, dass MYHASH sollte dann vom Typ sein Map<String, String> und nicht Hashtable<String, String>.)

Bezüglich der final Stichwort: wie die anderen schon sagten, es bedeutet, dass Sie keinen anderen zuweisen können Hashtable zu MYHASH aber die Karte selbst ist immer noch änderbar. Um dies zu ändern, müssen Sie es mit einem unveränderlichen Wrapper umhüllen, wie z UnmodifiableMap oben erwähnt.

Wie Joe sagte, das liegt daran final markiert die Referenz, nicht das Objekt.

Allerdings kann man damit machen was man will Collections.unmodifiableMap (sehen hier)

Benutzeravatar von G_H
G_H

Verwenden Sie für Felder und Variablen final bedeutet, dass sie nur einmal zugewiesen werden können. Entweder sofort oder zu einem späteren Zeitpunkt (zB in einem Konstruktor für Felder). Dies bedeutet nicht, dass die tatsächliche Instanz unveränderlich wird. Eine Hashtable ist eine Datenstruktur, der Sie Einträge hinzufügen können, unabhängig davon, wie sie einer Variablen zugewiesen wurde. Nur der Hinweis ist endgültig.

1430940cookie-checkErstellen von Hashtable als final in Java

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy