palantir / conjure-java

Conjure generator for Java clients and servers
Apache License 2.0
27 stars 43 forks source link

Alias types use memoized hashCode for collections #2291

Closed schlosna closed 5 months ago

schlosna commented 5 months ago

Before this PR

Generated alias types did not memoize hashCode, potentially leading to expensive hash code computations when the aliased type is an immutable collection or map.

A hypothetical example CompositeKey alias for Map<Field, Value> currently generates:

@Generated("com.palantir.conjure.java.types.AliasGenerator")
public final class CompositeKey {
    private static final CompositeKey EMPTY = new CompositeKey();

    private final Map<Field, Value> value;

    private CompositeKey(@Nonnull Map<Field, Value> value) {
        this.value = Preconditions.checkNotNull(value, "value cannot be null");
    }

    private CompositeKey() {
        this(Collections.emptyMap());
    }

    @JsonValue
    public Map<Field, Value> get() {
        return value;
    }

    @Override
    public String toString() {
        return value.toString();
    }

    @Override
    public boolean equals(@Nullable Object other) {
        return this == other
                || (other instanceof CompositeKey && this.value.equals(((CompositeKey) other).value));
    }

    @Override
    public int hashCode() {
        return value.hashCode();
    }

    @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
    public static CompositeKey of(@Nonnull Map<Field, Value> value) {
        return new CompositeKey(value);
    }

    public static CompositeKey empty() {
        return EMPTY;
    }
}

After this PR

==COMMIT_MSG== Alias types use memoized hashCode for collections ==COMMIT_MSG==

Possible downsides?

changelog-app[bot] commented 5 months ago

Generate changelog in changelog-dir>`changelog/@unreleased`</changelog-dir

What do the change types mean? - `feature`: A new feature of the service. - `improvement`: An incremental improvement in the functionality or operation of the service. - `fix`: Remedies the incorrect behaviour of a component of the service in a backwards-compatible way. - `break`: Has the potential to break consumers of this service's API, inclusive of both Palantir services and external consumers of the service's API (e.g. customer-written software or integrations). - `deprecation`: Advertises the intention to remove service functionality without any change to the operation of the service itself. - `manualTask`: Requires the possibility of manual intervention (running a script, eyeballing configuration, performing database surgery, ...) at the time of upgrade for it to succeed. - `migration`: A fully automatic upgrade migration task with no engineer input required. _Note: only one type should be chosen._
How are new versions calculated? - ❗The `break` and `manual task` changelog types will result in a major release! - 🐛 The `fix` changelog type will result in a minor release in most cases, and a patch release version for patch branches. This behaviour is configurable in autorelease. - ✨ All others will result in a minor version release.

Type

- [ ] Feature - [x] Improvement - [ ] Fix - [ ] Break - [ ] Deprecation - [ ] Manual task - [ ] Migration

Description

Alias types use memoized hashCode for collections **Check the box to generate changelog(s)** - [x] Generate changelog entry
svc-autorelease commented 5 months ago

Released 8.19.0