[cdi-dev] Mutable annotation literals
Mark Struberg
struberg at yahoo.de
Thu Aug 16 09:09:52 EDT 2012
> Except that the hash code rules for annotations aren't that easy to follow.
Exactly! That was the reason why I made the sample with the super.hashCode() code.
For any 'constant' AnnotationLiteral you just additionally add a few lines which 'caches' the hashCode.
public class TransactionScopedLiteral extends AnnotationLiteral<TransactionScoped> implements TransactionScoped {
private Integer hashCode = null;
public int hashCode() {
if (hashCode == null) {
hashCode = super.hashCode();
}
return hashCode;
}
...
}
we could of course also add a new additional constructor with a 'boolean constant' parameter
LieGrue,
strub
----- Original Message -----
> From: Pete Muir <pmuir at redhat.com>
> To: Mark Struberg <struberg at yahoo.de>
> Cc: cdi-dev <cdi-dev at lists.jboss.org>
> Sent: Thursday, August 16, 2012 3:01 PM
> Subject: Re: [cdi-dev] Mutable annotation literals
>
>
> On 16 Aug 2012, at 13:58, Mark Struberg wrote:
>
>> The problem is an AnnotationLiteral could theoretically be mutable as well.
> Thus the AnnotationLiteral class must not make such assumptions imo.
>
> Agreed.
>
>>
>>
>> I the case of an empty value-methods list we could btw also improve the
> equals method.
>
> Yes.
>
>>
>> In the case where you have value-methods, you already need to implement the
> interface manually. It would be no problem to just add the 2 lines for caching
> the hashCode in case the values do not change.
>
> Except that the hash code rules for annotations aren't that easy to follow.
>
>>
>>
>> LieGrue,
>> strub
>>
>>
>>
>> ----- Original Message -----
>>> From: Pete Muir <pmuir at redhat.com>
>>> To: Mark Struberg <struberg at yahoo.de>
>>> Cc: cdi-dev <cdi-dev at lists.jboss.org>
>>> Sent: Thursday, August 16, 2012 2:20 PM
>>> Subject: Re: [cdi-dev] Mutable annotation literals
>>>
>>> I guess what Marko/I am proposing is that we provide a utility for the
> common
>>> case of an immutable annotation literal with member values...
>>>
>>> On 16 Aug 2012, at 13:18, Mark Struberg wrote:
>>>
>>>> Imo we don't need to cache the hashCode in the
> AnnotationLiteral
>>> itself. We just need to cache if there are value methods or not. If
> not, then we
>>> can immediately return 0. If there are value methods present, then you
> need to
>>> extend the AnnotationLiteral class anyway and can add an own hashCode
> which
>>> delegates to super.hashCode() and caches the result if the values will
> not be
>>> changed.
>>>>
>>>> LieGrue,
>>>> strub
>>>>
>>>>
>>>>
>>>>
>>>> ----- Original Message -----
>>>>> From: Pete Muir <pmuir at redhat.com>
>>>>> To: cdi-dev <cdi-dev at lists.jboss.org>
>>>>> Cc:
>>>>> Sent: Thursday, August 16, 2012 1:43 PM
>>>>> Subject: [cdi-dev] Mutable annotation literals
>>>>>
>>>>> All
>>>>>
>>>>> Marko has added caching for the hashcode value on
> AnnotationLiteral,
>>> which is
>>>>> based on the premise that an AnnotationLiteral is not mutable.
>>>>>
>>>>>
>>>
> https://github.com/luksa/cdi/commit/f3c200fcdf8ca8681c194c921567aedcce375102
>>>>>
>>>>> This is a reasonable thing to require (as real annotations are
> normally
>>>
>>>>> immutable!) and a very good optimisation, however it is not
> backwards
>>>>> compatible, as we have not previously required
> AnnotationLiteral to be
>>>>> immutable.
>>>>>
>>>>> An alternative option is to introduce the
> ImmutableAnnotationLiteral
>>> subclass,
>>>>> which would require any concrete instances to be immutable and
> could
>>> use this
>>>>> optimisation. We could "deprecate" AnnotationLiteral
> (as
>>> described in
>>>>> java.net/projects/javaee-spec/pages/CompatibilityRequirements).
>>>>>
>>>>> Note that regardless, we can apply the minor optimisation
> suggested by
>>> Mark,
>>>>> that we return 0 if the annotation has no members.
>>>>>
>>>>> Pete
>>>>> _______________________________________________
>>>>> cdi-dev mailing list
>>>>> cdi-dev at lists.jboss.org
>>>>> https://lists.jboss.org/mailman/listinfo/cdi-dev
>>>>>
>>>
>
More information about the cdi-dev
mailing list