Heim > Java > Hauptteil

Wie erstelle ich eine statische Version einer Map, die die Getter/Setter eines Objekts enthält?

PHPz
Freigeben: 2024-02-06 08:03:03
nach vorne
654 Leute haben es durchsucht
Frageinhalt

Ich habe eine Map, die beim Aufruf eines Objekts erstellt wird und dem Aufrufer Variablennamen als Schlüssel und Getter/Setter-Paare als Werte bereitstellt. Das funktioniert wie erwartet. Mein Problem ist, dass ich es jedes Mal erstelle, wenn ich es aufrufe. Ich frage mich, ob es eine Möglichkeit gibt, es als statisch zu deklarieren und nur das Objekt bereitzustellen, für das ich es aufrufen möchte, sodass ich die Karte nicht erstellen muss jedes Mal, da sich Getter und Setter zur Laufzeit nicht ändern.

Ich habe:

package main;
import org.javatuples.Pair;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Supplier;

public interface MapPackHelperI 
{
     public Map<String, Pair<Supplier, Consumer>> getNameToGetterSetterMap();    
}
Nach dem Login kopieren
package main;

import java.util.List;
import java.util.Map;
import java.util.HashMap;
import org.javatuples.Pair;
import java.util.function.Consumer;
import java.util.function.Supplier;

public class SomeStruct implements MapPackHelperI
{
    private long somelong;
    private String somestring;
    private List<Float> somelistfloat;
    private SomeEnum someenum;

    public  Map<String, Pair<Supplier, Consumer>> getNameToGetterSetterMap()
    {
        Map<String, Pair<Supplier, Consumer>> nameToGetterSetterMap = new HashMap<>();        
        nameToGetterSetterMap.put("somelong", Pair.with( this::getSomelong, (Consumer<Long>)this::setSomelong));
        nameToGetterSetterMap.put("somestring", Pair.with( this::getSomestring, (Consumer<String>)this::setSomestring));
        nameToGetterSetterMap.put("somelistfloat", Pair.with( this::getSomelistfloat, (Consumer<List<Float>>)this::setSomelistfloat));
        nameToGetterSetterMap.put("someenum", Pair.with( this::getSomeenum, (Consumer<SomeEnum>)this::setSomeenum));
        return nameToGetterSetterMap;
    }

    public long getSomelong() {
        return this.somelong;
    }

    public void setSomelong(long somelong) {
        this.somelong = somelong;
    }

    public String getSomestring() {
        return this.somestring;
    }

    public void setSomestring(String somestring) {
        this.somestring = somestring;
    }

    public List<Float> getSomelistfloat() {
        return this.somelistfloat;
    }

    public void setSomelistfloat(List<Float> somelistfloat) {
        this.somelistfloat = somelistfloat;
    }

    public SomeEnum getSomeenum() {
        return this.someenum;
    }

    public void setSomeenum(SomeEnum someenum) {
        this.someenum = someenum;
    }

   // ... hashcode, toString, and equals, not relevant for the example
}
Nach dem Login kopieren

Das ermöglicht mir, von woanders aus zu tun:

public static String serialize(MapPackHelperI objectToSerialize) 
{
   Map<String, Pair<Supplier, Consumer>> nameToGetterSetterMap = objectToSerialize.getNameToGetterSetterMap();
   for(Entry<String, Pair<Supplier, Consumer>> current : nameToGetterSetterMap.entrySet())
   {
       String name = current.getKey();
       Supplier getter = current.getValue().getValue0();
       //code that serializes into string with name and getter regardless of the MapPackHelperI I pass in
   }

  // return the string representation of the object. I have another method that uses the same map to go the other way with the setter.
}
Nach dem Login kopieren

Wie gesagt, das funktioniert, aber jedes Mal, wenn ich es aufrufe, instanziiere und fülle ich die Karte.

Gibt es eine Möglichkeit, SomeStruct 有一个 public static Map<String, Pair<Supplier, Consumer>> nameToGetterSetterMap = new HashMap<>(); (或一些等效的),这样 public Map<String, Pairphpcnltphp cnSupplier、Consumer>> getNameToGetterSetterMap() 将实例化的参数作为参数SomeStruct zu erhalten und den Aufruf nur auf dieses bestimmte Objekt anzuwenden?

Ich habe versucht, eine statische Karte zu erstellen und sie mit SomeStruct::getSomelong usw. zu füllen, aber der Compiler sagte, dass ich das nicht kann.


Richtige Antwort


Mitgliederfeld

Die Antwort scheint so offensichtlich, dass ich etwas übersehen muss: Die neu erstellte Karte als privates Mitgliedsfeld zwischenspeichern.

public class SomeStruct implements MapPackHelperI
{
    private long somelong;
    private String somestring;
    private List<Float> somelistfloat;
    private SomeEnum someenum;
    private Map<String, Pair<Supplier, Consumer>> map = 
        Map.of( 
            "somelong", Pair.with( this::getSomelong, (Consumer<Long>)this::setSomelong) ,
            "somestring", Pair.with( this::getSomestring, (Consumer<String>)this::setSomestring) ,
            "somelistfloat", Pair.with( this::getSomelistfloat, (Consumer<List<Float>>)this::setSomelistfloat) ,
            "someenum", Pair.with( this::getSomeenum, (Consumer<SomeEnum>)this::setSomeenum)
        ) ;

    public  Map<String, Pair<Supplier, Consumer>> getNameToGetterSetterMap()
    {
        return this.map ;
    }

…
Nach dem Login kopieren

Bitte beachten Sie, dass Map.of nicht bearbeitbar ist.

Sie sollten in der Lage sein, unendlich oft zu instanziieren map 成员变量设置为 static,但除非您确定自己正在对 SomeStruct, sonst ist die Mikrooptimierung meines Erachtens nicht die Mühe wert.

Das obige ist der detaillierte Inhalt vonWie erstelle ich eine statische Version einer Map, die die Getter/Setter eines Objekts enthält?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage