I really prefer the ease-of-use afforded by consistently using enums. My options are just an auto-complete away.

As a perhaps lighter-weight variant on Andy's option (2) below, could we simply provide an alternative, string-based parameter to the annotation, such as 'customValueStrategy'?

    @Target({ElementType.FIELD, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Persistent
    {
        // ...
IdGeneratorStrategy valueStrategy() default IdGeneratorStrategy.UNKNOWN;
        String customValueStrategy() default "";
    }

I imagine these two options would be mutually exclusive, or an additional label could be added to the IdGeneratorStrategy, 'CUSTOM'. The implementation would enforce that 'customValueStrategy' can only be supplied when valueStrategy == CUSTOM.

All I really care about is that I can use language-level enums whenever I have an enumerated set of values to choose from. I'm okay with things being slightly awkward if I'm doing something a little out of the norm, like using a custom strategy.


Another option could be to have IdGeneratorStrategy become a marker interface and then have the enum be defined as something like:

    public interface IdGeneratorStrategy {}

public enum StandardIdGeneratorStrategy implements IdGeneratorStrategy
    {
        UNKNOWN,
        NATIVE,
        // ...
    };

This would allow implementations to supply custom id generators in a typesafe way:

    package org.jpox.annotations;
    public enum JPOXIdGeneratorStrategy implements IdGeneratorStrategy
    {
        AUID,
        // ...
    };

I like this latter approach, because it demonstrates very clearly that my usage is vendor-specific and non-portable.


On Aug 9, 2007, at 9:47 AM, Andy Jefferson wrote:

JDO2 defines particular id generation
strategies ... "identity", "increment", "sequence", "uuid-string", "uuid-hex", "native".
Obviously implementations can define their own add-on strategies.

In XML we have free-form text and so people can just type
<field value-strategy="auid"> and rely on the implementation providing one
called "auid".
In Annotations they currently can't do this since it uses an enum.


Two possible options
1. Remove IdGeneratorStrategy enum and just let people type in
the "valueStrategy" name (and @DatastoreIdentity "strategy"), so they can
access implementations own variants too.
2. Make implementations use the @Extension to access these vendor add-on
strategies and use IdGeneratorStrategy.UNKNOWN (which is in the enum
currently)


I'm swaying towards 1 since its more consistent with XML specification. Any
opinions ?

--
Andy  (Java Persistent Objects - http://www.jpox.org)

Reply via email to