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==
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.
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 forMap<Field, Value>
currently generates:After this PR
==COMMIT_MSG== Alias types use memoized hashCode for collections ==COMMIT_MSG==
Possible downsides?