[ 
https://issues.apache.org/jira/browse/GROOVY-8938?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16728687#comment-16728687
 ] 

Paul King commented on GROOVY-8938:
-----------------------------------

As Jochen mentions, the current behavior is mainly for historical reasons. If 
you add a modifier like 'synchronized' to the property, it probably makes sense 
to also add it to the getter but it's less clear for something like final. 
Similarly, there was lots of debate historically around annotations. An 
annotation on a property might make sense to be copied over to the field or 
just the getter or setter or to all places. The current approach has been to 
use a simple copying strategy for all modifiers and annotations. Even though it 
was never seen as ideal we hadn't defined a better approach to date.

> Final field caching issues in inherited field.
> ----------------------------------------------
>
>                 Key: GROOVY-8938
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8938
>             Project: Groovy
>          Issue Type: Bug
>          Components: groovy-runtime
>    Affects Versions: 2.5.4
>            Reporter: Anton Pryamostanov
>            Priority: Critical
>
> Note: **this seems to be a quite major issue**, kindly look at this one with 
> emphasis.
> Please see the below test case:
> SubClass extends the SuperClass and overrides the field "inheritedField".
> {code}
> class OtherClass {
>     String otherField
>     OtherClass(String otherField) {
>         this.otherField = otherField
>     }
>     String toString() {
>         return otherField
>     }
> }
> class SuperClass {
>     final OtherClass inheritedField = new OtherClass("Super Class String")
> }
> class SubClass extends SuperClass {
>     final OtherClass inheritedField = new OtherClass("Sub Class String")
> }
> SuperClass superClass = new SuperClass()
> SubClass subClass = new SubClass()
> assert subClass.inheritedField.toString() == "Sub Class String"
> {code}
> *Actual result*: assertion fails
> *Expected result*: assertion should pass
> *Note*: If "final" modifier is removed, assertion passes as expected.
> This seems an issue with final field caching.
> Assertion error text:
> {code}
> Assertion failed: 
> assert subClass.inheritedField.toString() == "Sub Class String"
>        |        |              |          |
>        |        |              |          false
>        |        |              'Super Class String'
>        |        Super Class String
>        SubClass@5b4b841f
>       at ConsoleScript11.run(ConsoleScript11:18)
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to