groovy-notifications mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Paul King (JIRA)" <>
Subject [jira] [Resolved] (GROOVY-8722) final modifier for non-abstract methods in traits is ignored
Date Mon, 06 Aug 2018 22:36:00 GMT


Paul King resolved GROOVY-8722.
       Resolution: Fixed
         Assignee: Paul King
    Fix Version/s: 2.5.2

I have added support for final methods but in the most backward compatible way possible for
now. We could make it stricter (produce compilation errors in some cases) for Groovy 3 but
I am disinclined to at this point. We could write Codenarc rules to detect cases that are
considered bad style.

For your example, both {{ActivityOverride}} and {{ActivityInherit}} will have {{final}} {{start}}
and {{stop}} methods but they are overridden in {{ActivityOverride}} and in fact would be
non-final if the overridden methods weren't final. So basically, existing rules for method
selection apply and don't look at the final modifier during method selection but after a method
is selected, if it is final, that will be reflected in the resulting woven method's modifiers.
You can achieve the affect you are after using a base class. The base class can multiply inherit
from traits (if needed) and then your application class would extend from the base class instead
of implement the traits. The class would look like this:
abstract class SuspendableBase implements Suspendable {}

> final modifier for non-abstract methods in traits is ignored
> ------------------------------------------------------------
>                 Key: GROOVY-8722
>                 URL:
>             Project: Groovy
>          Issue Type: Bug
>          Components: Compiler, Documentation
>    Affects Versions: 2.4.15, 2.5.1
>            Reporter: Dmytro Buryak
>            Assignee: Paul King
>            Priority: Major
>              Labels: documentation
>             Fix For: 2.5.2
> When using the {{final}} modifier in a trait non-abstract method signature, then:
>  * compiler successfully compiles trait and class that implements it
>  * final method of trait may be overridden in class that implements trait
>  * if class implements trait and doesn't override trait final method, then this method
is available as non-final method in class
>  * documentation says absolutely nothing about this
> In other words, {{final}} modifier is ignored in trait methods: code works the same with
or without it. Even if this behavior is expected, there's nothing about it in the documentation.
> Here's simple example gradle groovy project to demonstrate the issue:

This message was sent by Atlassian JIRA

View raw message