只有一个具有自定义构造函数逻辑的对象在循环中完全初始化

问题描述 投票:0回答:1

我正在尝试使用以下代码将一个对象映射到另一个对象(Record-> ParsedAddress):

public class ParsedAddress extends Address {

    private static final Map<Field, Consumer<String>> MAPPINGS = new EnumMap<>(Field.class);


    public ParsedAddress(final Record record, final List<Field> order) {
        super();

        this.mapFields(record, order);
    }

    private void mapFields(final Record record, final List<Field> order) {
        this.setupMapping();

        for (final Map.Entry<Field, Consumer<String>> mapping : MAPPINGS.entrySet()) {
            final Field field = mapping.getKey();
            final String value = record.getField(field, order);
            final Consumer<String> setter = mapping.getValue();

            setter.accept(value);
        }
    }

    private void setupMapping() {
        if (!MAPPINGS.isEmpty()) return;

        MAPPINGS.put(SALUTATION, this::setSalutation);
        MAPPINGS.put(FIRST_NAME, this::setFirstName);
        MAPPINGS.put(SURNAME, this::setSurname);
        // etc...
    }
}

([Address是包含所有映射字段的数据对象。)

我这样称呼构造函数:

records.stream()
       .map(record -> new ParsedAddress(record, ORDER))
       .collect(toUnmodifiableList());

但是只有第一个“记录”被映射。结果集合包含一个具有所有数据的ParsedAddress(因此逻辑工作正常)和具有ParsedAddress字段的null

我调试了它,并设法将问题缩小到setter.accept(value)行。无论在流还是循环中调用构造函数,其工作原理都完全相同。

关于对象初始化吗?但是,为什么一个对象恰好成功映射,而其余对象却不成功?

编辑

Record类仅包含要映射的数据。这是getField方法:
public String getField(final Field field, final List<Field> order) {
    final int index = order.indexOf(field);

    return index == -1 ? null : this.data.get(index);
}
    

我正在尝试使用以下代码将一个对象映射到另一个对象(记录-> ParsedAddress):公共类ParsedAddress扩展了地址{私有静态最终Map ]

java
1个回答
0
投票

这里的问题是,MAPPINGS映射是延迟加载的静态映射,而this关键字不是。

这将导致地图被完全填充一次,但引用了到达该地图的第一个对象(延迟加载地图的对象)的公共设置器。

© www.soinside.com 2019 - 2024. All rights reserved.