Rumah > Java > teks badan

Bagaimana untuk membuat versi statik Peta yang memegang getter/setter objek?

PHPz
Lepaskan: 2024-02-06 08:03:03
ke hadapan
624 orang telah melayarinya
Kandungan soalan

Saya mempunyai peta yang dibina apabila objek dipanggil, yang menyediakan pemanggil dengan nama pembolehubah sebagai kunci dan pasangan getter/setter sebagai nilai. Ini berfungsi seperti yang diharapkan. Masalah saya ialah ia membina setiap kali saya memanggilnya, saya tertanya-tanya sama ada terdapat cara untuk mengisytiharkannya sebagai statik dan hanya menyediakan objek yang saya mahu memanggilnya supaya saya tidak perlu membina peta setiap kali kerana Getters dan setter tidak berubah semasa runtime.

Saya ada:

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();    
}
Salin selepas log masuk
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
}
Salin selepas log masuk

Ini membolehkan saya melakukan dari tempat lain:

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.
}
Salin selepas log masuk

Seperti yang saya katakan, ini berfungsi, tetapi setiap kali saya memanggilnya, saya membuat instantiat dan mengisi peta.

Adakah terdapat cara untuk mendapatkan SomeStruct 有一个 public static Map<String, Pair<Supplier, Consumer>> nameToGetterSetterMap = new HashMap<>(); (或一些等效的),这样 public Map<String, Pairphpcnltphp cnSupplier、Consumer>> getNameToGetterSetterMap() 将实例化的参数作为参数SomeStruct dan gunakan panggilan hanya pada objek tertentu itu.

Saya cuba membuat peta statik dan mengisinya dengan SomeStruct::getSomelong dan lain-lain tetapi pengkompil berkata saya tidak boleh berbuat demikian.


Jawapan Betul


Bidang Ahli

Jawapannya nampak begitu jelas, saya pasti kehilangan sesuatu: cache peta yang baru dibina sebagai medan ahli persendirian.

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 ;
    }

…
Salin selepas log masuk

Sila ambil perhatian bahawa Map.of adalah tidak boleh diedit.

Anda sepatutnya boleh membuat instantiate map 成员变量设置为 static,但除非您确定自己正在对 SomeStruct bilangan kali yang tidak terhingga, jika tidak, saya tidak fikir ia adalah pengoptimuman mikro yang berbaloi dengan masalah.

Atas ialah kandungan terperinci Bagaimana untuk membuat versi statik Peta yang memegang getter/setter objek?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!