Hi Robert,

Thanks a lot for all the work of going through the classes. At first
sight, the classes look quite well chosen.

One question concerning the @Public, @Experimental, and @Internal annotations:

@Public may only be used for classes or interfaces. @Experimental or
@Internal are used for marking methods in @Public classes only? If
that is the case, we should restrict the annotations to this scope via
@Target. The current master also permits to tag classes with
@Experimental or @Internal.

Marking classes with @Experimental might actually make sense. What was
the rational behind always declaring a class public first to restrict
its methods to internal or experimental?

Cheers,
Max

On Fri, Feb 5, 2016 at 3:07 PM, Robert Metzger <rmetz...@apache.org> wrote:
> Hi,
>
> tl;dr: we now have @Public, @Internal, @Experimental annotations. Check
> your stuff before the release!
>
> Fabian and I spend some time the last weeks to annotate all classes we
> consider to be userfacing and stable with the "*@Public*" annotation. I
> just pushed those changes to master.
>
> There is also an annotation "*@Internal*" for marking interfaces users
> should not use because they are internal to the system (for example
> "DataStream.getId()").
>
> The annotation "*@Experimental*" marks unstable methods within stable
> classes (for example SingleOutputStreamOperator.uid()).
> Also note that we should also annotate @Deprecated methods with
> @Experimental so that they are not part of the stable interface (this works
> only before the 1.0 release). I checked that all current @Deprecated
> annotations are excluded.
>
>
> *I would like to ask everyone to spend some time before the 1.0 release to
> go through some core classes and see if there is anything we forgot.*
> *We will not be able to touch methods and classes which are public after
> the 1.0 release.*
>
> Some areas where I feel we should check closely are the following:
> - InputFormats
> - State-related classes
> - Windowing related classes
> - DataStream API (global() / forward(); output to files; ... ).
>
> Fabian and I also realized that there are some downsides to this annotation
> approach.
> a) By not annotating all classes, its easy to forget some classes. And its
> not obvious to users that "no annotation" means "not public".
>
> b) For example the "SourceFunction.SourceContext" interface is @Public
> because users use the methods of the interface.
> However, the underlying implementations are internal to Flink (users will
> most likely not implement their own SourceContexts). Adding a new method to
> the SourceContext interface will break its compatibilty (because users
> would need to implement the new method), however, for API users it does not
> matter when we are adding new methods.
> We decided to make the interface @Public, but we added a comment explaining
> the issue.
> If we want to add a method after the 1.0 release, we can define an exclude
> in the maven plugin which enforces the interface stability.
>
>
> For making the whole annotation analysis business a bit easier, I'm
> currently working on a little tool to output a list of public classes and
> methods. I'll post that on the mailing list at a later point.
>
> Regards,
> Robert

Reply via email to