10 KiB
AutoValue Changes
This document is obsolete. For details of changes in releases since 1.5, see the releases page for the Auto project.
1.4 → 1.5
Functional changes
-
A workaround for older Eclipse versions has been removed. If you need to use an Eclipse version older than 4.5, you will need to stay on AutoValue 1.4.
-
The retention of the
@AutoValue
annotation has changed fromSOURCE
toCLASS
. This means that it is possible for code-analysis tools to tell whether a class is an@AutoValue
. AutoValue itself uses this to enforce the check that one@AutoValue
class cannot extend another, even if the classes are compiled separately. -
It is now an error if
@Memoized
is applied to a method not inside an@AutoValue
class. -
Type annotations are now handled more consistently. If
@Nullable
is a type annotation, a property of type@Nullable Integer
will have that type used everywhere in the generated code. Associated bugs with nested type annotations, likeOuter.@Inner
, have been fixed.
Bugs fixed since 1.4.1
-
@Memoized
methods can now throw checked exceptions. Previously this failed because the exceptions were not copied into thethrows
clause of the generated override, so the call tosuper.foo()
did not compile. -
The generated
hashCode()
method usesh = (int) (h ^ longProperty)
rather thanh ^= longProperty
to avoid warnings about loss of precision. -
Annotations are not copied from an abstract method to its implementation if they are not visible from the latter. This can happen if the
@AutoValue
inherits the abstract method from a class or interface in a different package.
1.3 → 1.4
This is the last AutoValue version that compiles and runs on Java 6. Future
versions will require at least Java 8 to run. We will continue to generate code
that is compatible with Java 7, so AutoValue can be used with javac -source 7 -target 7 -bootclasspath <rt.jar-from-jdk7>
, but using the javac
from jdk8 or
later.
Functional changes
-
Builder setters now reject a null parameter immediately unless the corresponding property is
@Nullable
. Previously this check happened atbuild()
time, and in some cases didn't happen at all. This is the change that is most likely to affect existing code. -
Added
@Memoized
. A@Memoized
method will be overridden in the generatedAutoValue_Foo
class to save the value returned the first time it was called and reuse that every other time. -
Generalized support for property builders. Now, in addition to being able to say
immutableListBuilder()
for a property of typeImmutableList<T>
, you can sayfooBuilder()
for a property of an arbitrary type that has a builder following certain conventions. In particular, you can do this if the type offoo()
is itself an@AutoValue
class with a builder. The default value offoo()
, iffooBuilder()
is never called, isfooBuilder().build()
. -
If a property
foo()
orgetFoo()
has a builder methodfooBuilder()
then the property can not now be@Nullable
. AnImmutableList
, for example, starts off empty, not null, so@Nullable
was misleading. -
When an
@AutoValue
classFoo
has a builder, the generatedAutoValue_Foo.Builder
has a constructorAutoValue_Foo.Builder(Foo)
. That constructor was never documented and is now private. If you want to make aFoo.Builder
from aFoo
,Foo
should have an abstract methodBuilder toBuilder()
.This change was necessary so that generalized property-builder support could know whether or not the built class needs to be convertible back into its builder. That's only necessary if there is a
toBuilder()
. -
The Extension API is now a committed API, meaning we no longer warn that it is likely to change incompatibly. A guide gives tips on writing extensions.
-
Extensions can now return null rather than generated code. In that case the extension does not generate a class in the AutoValue hierarchy, but it can still do other things like error checking or generating side files.
-
Access modifiers like
protected
are copied from builder methods to their implementations, instead of the implementations always being public. Change by @torquestomp. -
AutoAnnotation now precomputes parts of the
hashCode
that are constant because they come from defaulted methods. This avoids warnings about integer overflow from tools that check that. -
If a property is called
oAuth()
, its setter can be calledsetOAuth(x)
. Previously it had to besetoAuth(x)
, which is still allowed.
Bugs fixed
-
AutoAnnotation now correctly handles types like
Class<? extends Annotation>[]
. Previously it would try to create a generic array, which Java doesn't allow. Change by @lukesandberg. -
We guard against spurious exceptions due to a JDK bug in reading resources from jars. (#365)
-
We don't propagate an exception if a corrupt jar is found in extension loading.
-
AutoValue is ready for Java 9, where public classes are not necessarily accessible, and javax.annotation.Generated is not necessarily present.
-
AutoValue now works correctly even if the version of AutoValue in the
-classpath
is older than the one in the-processorpath
. -
Builders now behave correctly when there is a non-optional property called
missing
. Previously a variable-hiding problem meant that we didn't detect when it wasn't set. -
If
@AutoValue class Foo
has a builder, we always generated two constructors,Builder()
andBuilder(Foo)
, but we only used the second one ifFoo
had atoBuilder()
method. Now we only generate that constructor if it is needed. That avoids warnings about unused code. -
@AutoAnnotation
now works when the annotation and the factory method are in the default (unnamed) package.
1.2 → 1.3
Functional changes
-
Support for TYPE_USE
@Nullable
. This is https://github.com/google/auto/pull/293 by @brychcy. -
Restructured the code in AutoValueProcessor for handling extensions, to get rid of warnings about abstract methods when those methods are going to be implemented by an extension, and to fix a bug where extensions would not work right if there was a toBuilder() method. Some of the code in this change is based on https://github.com/google/auto/pull/299 by @rharter.
-
Added support for "optional getters", where a getter in an AutoValue Builder can have type
Optional<T>
and it will returnOptional.of(x)
wherex
is the value that has been set in the Builder, orOptional.empty()
if no value has been set. -
In AutoValue builders, added support for setting a property of type
Optional<T>
via a setter with an argument of typeT
. -
Added logic to AutoValue to detect the confusing case where you think you are using JavaBeans conventions (like getFoo()) but you aren't because at least one method isn't.
-
Added a README.md describing EscapeVelocity.
Bugs fixed
-
Allow an
@AutoValue.Builder
to extend a parent builder using the<B extends Builder<B>>
idiom. -
AutoAnnotation now factors in package names when detecting overloads. Previously it treated all annotations with the same SimpleName as being overload attempts.
-
Removed an inaccurate javadoc reference, which referred to an artifact from an earlier draft version of the Extensions API. This is https://github.com/google/auto/pull/322 by @lucastsa.
1.1 → 1.2
Functional changes
-
A provisional extension API has been introduced. This will change in a later release. If you want to use it regardless, see the AutoValueExtension class.
-
Properties of primitive array type (e.g.
byte[]
) are no longer cloned when read. If your@AutoValue
class includes an array property, by default it will get a compiler warning, which can be suppressed with@SuppressWarnings("mutable")
. -
An
@AutoValue.Builder
type can now define both the setter and builder methods like so:... abstract void setStrings(ImmutableList<String>); abstract ImmutableList.Builder<String> stringsBuilder(); ...
At runtime, if
stringsBuilder()...
is called then it is an error to callsetStrings(...)
afterwards. -
The classes in the autovalue jar are now shaded with a
$
so they never appear in IDE autocompletion. -
AutoValue now uses its own implementation of a subset of Apache Velocity, so there will no longer be problems with interference between the Velocity that was bundled with AutoValue and other versions that might be present.
Bugs fixed
-
Explicit check for nested
@AutoValue
classes being private, or not being static. Otherwise the compiler errors could be hard to understand, especially in IDEs. -
An Eclipse bug that could occasionally lead to exceptions in the IDE has been fixed (GitHub issue #200).
-
Fixed a bug where AutoValue generated incorrect code if a method with a type parameter was inherited by a class that supplies a concrete type for that parameter. For example
StringIterator implements Iterator<String>
, where the type ofnext()
is String, notT
. -
In
AutoValueProcessor
, fixed an exception that happened if the same abstract method was inherited from more than one parent (Github Issue #267). -
AutoValue now works correctly in an environment where
@javax.annotation.Generated
does not exist. -
Properties marked
@Nullable
now get@Nullable
on the corresponding constructor parameters in the generated class.
1.0 → 1.1
Functional changes
-
Adds builders to AutoValue. Builders are nested classes annotated with
@AutoValue.Builder
. -
Annotates constructor parameters with
@Nullable
if the corresponding property methods are@Nullable
. -
Changes Maven shading so org.apache.commons is shaded.
-
Copies a
@GwtCompatible
annotation from the@AutoValue
class to its implementation subclass.
Bugs fixed
- Works around a bug in the Eclipse compiler that meant that annotations
would be incorrectly copied from
@AutoValue
methods to their implementations.
1.0 (Initial Release)
-
Allows automatic generation of value type implementations