Hi,

@Experimental and @Internal have the class scope, because we need to be
able to mark internal classes of @Public classes as experimental or
internal.

In some cases we annotated classes as @Public and all (or most) methods as
@Experimental, to indicate that a class can be used, but its internals
might change.
For example TypeInformation is a public class (and many classes that extend
this class) but most methods are @Experimental to allow users to used a
TypeInformation as is, but keep the freedom to change the internals. If you
find something that does not look correct, please start a discussion about.
The annotations can still be changed before the 1.0 release.

I agree with Max that annotating more classes with @Experimental (not only
inner classes) would be a good idea.
IMO, we should annotate all classes that belong to the user-facing API with
either @Public or @Experimental. This would mean that all non-annotated
classes are not part of the API and must be considered as internal. I
believe this would avoid a lot of uncertainty and also easy the annotation
management as a whole. For instance, we can more easily check how the API
(stable and experimental) changed between releases.

Cheers, Fabian

2016-02-05 17:24 GMT+01:00 Maximilian Michels <m...@apache.org>:

> 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