You can work around annotation permissiveness by implementing an annotation
processor to fail compilations with improper combinations of annotations,
but I feel that the annotation+enum approach is a lot simpler to enforce.

On 18 April 2017 at 04:40, sebb <seb...@gmail.com> wrote:

> I think ThreadingBehavior is very confusing as an enum.
>
> I expect enum values to be mutually exclusive, but STATELESS is also
> IMMUTABLE.
> And of course IMMUTABLE is SAFE.
>
> How do I know which enum to use?
>
> I don't think this is a good solution to the potential problem of
> someone using both @ThreadSafe and @NotThreadsafe.
>
>
>
> On 18 April 2017 at 07:49, Benedikt Ritter <brit...@apache.org> wrote:
> > Hi,
> >
> >> Am 18.04.2017 um 08:46 schrieb Gary Gregory <garydgreg...@gmail.com>:
> >>
> >> Because if you use multiple annotations, you (or tools) can write silly
> >> things like:
> >>
> >> @ThreadSafe
> >> @NotThreadSafe
> >> public class Foo {
> >>   …
> >> }
> >
> > Thank you for the clarification. It makes complete sense to me. Given
> this reason I’m fine with @Contract.
> >
> > Benedikt
> >
> >>
> >> Gary
> >>
> >> On Mon, Apr 17, 2017 at 11:27 PM, Benedikt Ritter <brit...@apache.org>
> >> wrote:
> >>
> >>> Hello Gary,
> >>>
> >>> Can you please explain why you think it is better to use a single
> >>> parameterized annotation over several individual annotations?
> >>>
> >>> Thank you!
> >>> Benedikt
> >>>
> >>>> Am 17.04.2017 um 20:54 schrieb ggreg...@apache.org:
> >>>>
> >>>> Repository: commons-lang
> >>>> Updated Branches:
> >>>> refs/heads/master 5242157df -> a5e76ebc4
> >>>>
> >>>>
> >>>> [LANG-1291] Provide annotations to document thread safety.
> >>>>
> >>>> Project: http://git-wip-us.apache.org/repos/asf/commons-lang/repo
> >>>> Commit: http://git-wip-us.apache.org/repos/asf/commons-lang/commit/
> >>> a5e76ebc
> >>>> Tree: http://git-wip-us.apache.org/repos/asf/commons-lang/tree/
> a5e76ebc
> >>>> Diff: http://git-wip-us.apache.org/repos/asf/commons-lang/diff/
> a5e76ebc
> >>>>
> >>>> Branch: refs/heads/master
> >>>> Commit: a5e76ebc404d419651c2a25b1a62199de64cccf5
> >>>> Parents: 5242157
> >>>> Author: Gary Gregory <garydgreg...@gmail.com>
> >>>> Authored: Mon Apr 17 11:54:04 2017 -0700
> >>>> Committer: Gary Gregory <garydgreg...@gmail.com>
> >>>> Committed: Mon Apr 17 11:54:04 2017 -0700
> >>>>
> >>>> ------------------------------------------------------------
> ----------
> >>>> .../lang3/concurrent/annotation/Contract.java   | 50 +++++++++++++++
> >>>> .../annotation/ThreadingBehavior.java           | 66
> >>> ++++++++++++++++++++
> >>>> 2 files changed, 116 insertions(+)
> >>>> ------------------------------------------------------------
> ----------
> >>>>
> >>>>
> >>>> http://git-wip-us.apache.org/repos/asf/commons-lang/blob/
> >>> a5e76ebc/src/main/java/org/apache/commons/lang3/concurrent/annotation/
> >>> Contract.java
> >>>> ------------------------------------------------------------
> ----------
> >>>> diff --git a/src/main/java/org/apache/commons/lang3/concurrent/
> annotation/Contract.java
> >>> b/src/main/java/org/apache/commons/lang3/concurrent/
> >>> annotation/Contract.java
> >>>> new file mode 100644
> >>>> index 0000000..e34bb95
> >>>> --- /dev/null
> >>>> +++ b/src/main/java/org/apache/commons/lang3/concurrent/
> >>> annotation/Contract.java
> >>>> @@ -0,0 +1,50 @@
> >>>> +/*
> >>>> + * ============================================================
> ========
> >>>> + * Licensed to the Apache Software Foundation (ASF) under one
> >>>> + * or more contributor license agreements.  See the NOTICE file
> >>>> + * distributed with this work for additional information
> >>>> + * regarding copyright ownership.  The ASF licenses this file
> >>>> + * to you under the Apache License, Version 2.0 (the
> >>>> + * "License"); you may not use this file except in compliance
> >>>> + * with the License.  You may obtain a copy of the License at
> >>>> + *
> >>>> + *   http://www.apache.org/licenses/LICENSE-2.0
> >>>> + *
> >>>> + * Unless required by applicable law or agreed to in writing,
> >>>> + * software distributed under the License is distributed on an
> >>>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >>>> + * KIND, either express or implied.  See the License for the
> >>>> + * specific language governing permissions and limitations
> >>>> + * under the License.
> >>>> + * ============================================================
> ========
> >>>> + *
> >>>> + * This software consists of voluntary contributions made by many
> >>>> + * individuals on behalf of the Apache Software Foundation.  For more
> >>>> + * information on the Apache Software Foundation, please see
> >>>> + * <http://www.apache.org/>.
> >>>> + *
> >>>> + */
> >>>> +package org.apache.commons.lang3.concurrent.annotation;
> >>>> +
> >>>> +import java.lang.annotation.Documented;
> >>>> +import java.lang.annotation.ElementType;
> >>>> +import java.lang.annotation.Retention;
> >>>> +import java.lang.annotation.RetentionPolicy;
> >>>> +import java.lang.annotation.Target;
> >>>> +
> >>>> +/**
> >>>> + * This annotation defines behavioral contract enforced at runtime by
> >>> instances of annotated classes.
> >>>> + */
> >>>> +@Documented
> >>>> +@Target(ElementType.TYPE)
> >>>> +@Retention(RetentionPolicy.CLASS)
> >>>> +public @interface Contract {
> >>>> +
> >>>> +    /**
> >>>> +     * Defines behavioral contract enforced at runtime by instances
> of
> >>> annotated classes.
> >>>> +     *
> >>>> +     * @return The behavioral contract enforced at runtime by
> instances
> >>> of annotated classes.
> >>>> +     */
> >>>> +    ThreadingBehavior threading() default ThreadingBehavior.UNSAFE;
> >>>> +
> >>>> +}
> >>>>
> >>>> http://git-wip-us.apache.org/repos/asf/commons-lang/blob/
> >>> a5e76ebc/src/main/java/org/apache/commons/lang3/concurrent/annotation/
> >>> ThreadingBehavior.java
> >>>> ------------------------------------------------------------
> ----------
> >>>> diff --git a/src/main/java/org/apache/commons/lang3/concurrent/
> >>> annotation/ThreadingBehavior.java b/src/main/java/org/apache/
> >>> commons/lang3/concurrent/annotation/ThreadingBehavior.java
> >>>> new file mode 100644
> >>>> index 0000000..e03b164
> >>>> --- /dev/null
> >>>> +++ b/src/main/java/org/apache/commons/lang3/concurrent/
> >>> annotation/ThreadingBehavior.java
> >>>> @@ -0,0 +1,66 @@
> >>>> +/*
> >>>> + * ============================================================
> ========
> >>>> + * Licensed to the Apache Software Foundation (ASF) under one
> >>>> + * or more contributor license agreements.  See the NOTICE file
> >>>> + * distributed with this work for additional information
> >>>> + * regarding copyright ownership.  The ASF licenses this file
> >>>> + * to you under the Apache License, Version 2.0 (the
> >>>> + * "License"); you may not use this file except in compliance
> >>>> + * with the License.  You may obtain a copy of the License at
> >>>> + *
> >>>> + *   http://www.apache.org/licenses/LICENSE-2.0
> >>>> + *
> >>>> + * Unless required by applicable law or agreed to in writing,
> >>>> + * software distributed under the License is distributed on an
> >>>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >>>> + * KIND, either express or implied.  See the License for the
> >>>> + * specific language governing permissions and limitations
> >>>> + * under the License.
> >>>> + * ============================================================
> ========
> >>>> + *
> >>>> + * This software consists of voluntary contributions made by many
> >>>> + * individuals on behalf of the Apache Software Foundation.  For more
> >>>> + * information on the Apache Software Foundation, please see
> >>>> + * <http://www.apache.org/>.
> >>>> + *
> >>>> + */
> >>>> +package org.apache.commons.lang3.concurrent.annotation;
> >>>> +
> >>>> +/**
> >>>> + * Defines types of threading behavior enforced at runtime.
> >>>> + */
> >>>> +public enum ThreadingBehavior {
> >>>> +
> >>>> +    /**
> >>>> +     * Instances of classes with the given contract are expected to
> be
> >>> fully immutable and thread-safe.
> >>>> +     */
> >>>> +    IMMUTABLE,
> >>>> +
> >>>> +    /**
> >>>> +     * Instances of classes with the given contract are expected to
> be
> >>> immutable if their dependencies injected at
> >>>> +     * construction time are immutable and are expected to be
> >>> thread-safe if their dependencies are thread-safe.
> >>>> +     */
> >>>> +    IMMUTABLE_CONDITIONAL,
> >>>> +
> >>>> +    /**
> >>>> +     * Instances of classes with the given contract are expected to
> >>> maintain no state and to be thread-safe.
> >>>> +     */
> >>>> +    STATELESS,
> >>>> +
> >>>> +    /**
> >>>> +     * Instances of classes with the given contract are expected to
> be
> >>> fully thread-safe.
> >>>> +     */
> >>>> +    SAFE,
> >>>> +
> >>>> +    /**
> >>>> +     * Instances of classes with the given contract are expected to
> be
> >>> thread-safe if their dependencies injected at
> >>>> +     * construction time are thread-safe.
> >>>> +     */
> >>>> +    SAFE_CONDITIONAL,
> >>>> +
> >>>> +    /**
> >>>> +     * Instances of classes with the given contract are expected to
> be
> >>> non thread-safe.
> >>>> +     */
> >>>> +    UNSAFE
> >>>> +
> >>>> +}
> >>>>
> >>>
> >>>
> >>> ---------------------------------------------------------------------
> >>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >>> For additional commands, e-mail: dev-h...@commons.apache.org
> >>>
> >>>
> >>
> >>
> >> --
> >> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
> >> Java Persistence with Hibernate, Second Edition
> >> <https://www.amazon.com/gp/product/1617290459/ref=as_li_
> tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1617290459&
> linkCode=as2&tag=garygregory-20&linkId=cadb800f39946ec62ea2b1af9fe6a2b8>
> >>
> >> <http:////ir-na.amazon-adsystem.com/e/ir?t=garygregory-20&l=am2&o=1&a=
> 1617290459>
> >> JUnit in Action, Second Edition
> >> <https://www.amazon.com/gp/product/1935182021/ref=as_li_
> tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1935182021&
> linkCode=as2&tag=garygregory-20&linkId=31ecd1f6b6d1eaf8886ac902a24de418%22
> >
> >>
> >> <http:////ir-na.amazon-adsystem.com/e/ir?t=garygregory-20&l=am2&o=1&a=
> 1935182021>
> >> Spring Batch in Action
> >> <https://www.amazon.com/gp/product/1935182951/ref=as_li_
> tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1935182951&
> linkCode=%7B%7BlinkCode%7D%7D&tag=garygregory-20&linkId=%7B%
> 7Blink_id%7D%7D%22%3ESpring+Batch+in+Action>
> >> <http:////ir-na.amazon-adsystem.com/e/ir?t=garygregory-20&l=am2&o=1&a=
> 1935182951>
> >> Blog: http://garygregory.wordpress.com
> >> Home: http://garygregory.com/
> >> Tweet! http://twitter.com/GaryGregory
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> > For additional commands, e-mail: dev-h...@commons.apache.org
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> For additional commands, e-mail: dev-h...@commons.apache.org
>
>


-- 
Matt Sicker <boa...@gmail.com>

Reply via email to