optaplanner-core/src/main/java/org/optaplanner/core/config/util/ConfigUtils.java
public static <T> T meldProperty(T a, T b) {
        if (a == null && b == null) {
            return null;
        } else if (a == null && b != null) {
            return b;
        } else if (a != null && b == null) {
            return a;
        } else {
            return ConfigUtils.mergeProperty(a, b);
        }
    }
public static <T> T meldProperty(T a, T b) {
        if (a == null && b == null) {
            return null;
        } else if (a == null && b != null) {
            return b;
        } else if (a != null && b == null) {
            return a;
        } else {
            return ConfigUtils.mergeProperty(a, b);
        }
    }
A relaxed version of {@link #mergeProperty(Object, Object)}. Used primarily for merging failed benchmarks,
where a property remains the same over benchmark runs (for example: dataset problem size), but the property in
the failed benchmark isn't initialized, therefore null. When merging, we can still use the correctly initialized
property of the benchmark that didn't fail.
<p>
Null-handling:
<ul>
<li>if <strong>both</strong> properties <strong>are null</strong>, returns null</li>
<li>if <strong>only one</strong> of the properties <strong>is not null</strong>, returns that property</li>
<li>if <strong>both</strong> properties <strong>are not null</strong>, returns {@link #mergeProperty(Object, Object)}</li>
</ul>

@see #mergeProperty(Object, Object)
@param a property {@code a}
@param b property {@code b}
@param <T> the type of property {@code a} and {@code b}
@return sometimes null