Hi Paul,

I think the core of the problem is, that @Immutable as a meta-annotation woud be better off being called something along the line of @ImmutableCanonical (see: If you do no need the immutability, use @Canonical), since it does not solely supply immutability support - then it would be natural to call the actual core immutability annotation just "Immutable".

That is probably off the table, since it would be a breaking change - so we are stuck with the problem of naming the immutability annotation part something else.

@ImmutableClass would imply to me that the "Class" part carries some meaning, which I feel it does not, since
a) "Class" could be postfixed to any annotation name that applies to classes
b) The meta-annotation should accordingly also be called "ImmutableClass"
Because of that I find postfixing "Immutable" with "Class" just confusing. It also is not intuitive to me, which annotation does only supply the core, and which supplies the extended (canonical) functionality...

I do not understand where you are going with @KnownImmutable (known to whom ?-) To me this seems less intuitive/more confusing than @ImmutableClass...).

@ImmutableCore is similar to @ImmutableBase (because I intentionally based it on it :-) ), but different in the sense that it imho expresses the semantics of the annotation: Making the object purely immutable-only, without any constructors, toString functionality, etc.

How about:
@ImmutableOnly
@PureImmutable
@ModificationProtected

@Locked
@Frozen

@Unchangeable
@Changeless

@InitOnly
@InitializeOnly

@Constant
@Const

@NonModifieable
@NonChangeable

?
mg


On 12.01.2018 08:01, Paul King wrote:
@ImmutableCore is similar to @ImmutableBase - probably okay but I don't think ideal. Another alternative would be @ImmutableInfo or have an explicit marker interface with a different package, e.g. groovy.transform.marker.Immutable but that might cause IDE completion headaches. Perhaps @KnownImmutable as a straight marker interface might be the way to go - then it could be used explicitly on manually created immutable classes and avoid the need to use the knownImmutableClasses/knownImmutables annotation attributes for that case.

Cheers, Paul.

On Thu, Jan 11, 2018 at 9:34 PM, mg <mg...@arscreat.com <mailto:mg...@arscreat.com>> wrote:

    Hi Paul,

    great to make @Immutable more fine granular / flexible :-)

    what about
    @ImmutabilityChecked
    or
    @ImmutableCore
    instead of @ImmutableClass ?

    Cheers
    mg

    -------- Ursprüngliche Nachricht --------
    Von: Paul King <pa...@asert.com.au <mailto:pa...@asert.com.au>>
    Datum: 11.01.18 08:07 (GMT+01:00)
    An: dev@groovy.apache.org <mailto:dev@groovy.apache.org>
    Betreff: Making @Immutable a meta-annotation


    There has been discussion on and off about making @Immutable a
    meta-annotation (annotation collector) in much the same way as
    @Canonical was re-vamped. (This is for 2.5+).

    I have a preliminary PR which does this:
    https://github.com/apache/groovy/pull/653
    <https://github.com/apache/groovy/pull/653>

    Preliminary because it still needs a bit of refactoring to reduce
    some duplication of code that exists between the normal and
    immutable map and tuple constructors. I still need to do this but
    that can happen transparently behind the scenes as an
    implementation detail if we don't finish it straight away. As well
    as reducing duplication, the pending refactoring will enable
    things like the pre and post options for MapConstructor and
    TupleConstructor which aren't currently working.

    I am keen on any feedback at this point. In particular, while most
    of the functionality is pushed off into the collected
    annotations/transforms, I ended up with some left over checks
    which I kept in an annotation currently called @ImmutableClass. I
    tried various names for this class, e.g. @ImmutableBase and
    @ImmutableCheck but finally settled on @ImmutableClass since the
    annotation causes the preliminary checks to be performed but also
    acts as a marker interface for the MapConstructor and
    TupleConstructor transforms to do the alternate code needed for
    immutability and to indicate that a class is immutable when it
    might itself be a property of another immutable class. Let me know
    if you can think of a better name or have any other feedback.

    Cheers, Paul.



Reply via email to