Hi Shuyi, I am already assuming all package private and protected modifiers will be cleaned up and moved to internal implementation. Please correct me if I were wrong, Timo.
Thanks, Rong On Fri, Mar 2, 2018, 5:02 PM Shuyi Chen <suez1...@gmail.com> wrote: > Hi Timo, > > I am throwing some second thoughts here, as I don't quite see what trait > provides over abstract class here for TableEnvironment case. Trait in scala > can also have implementation and you can have 'private[flink]' or > 'protected' type and method in trait as well. > > AFAIK, the differences between Scala trait and abstract class are: > 1) you can have constructor for abstract class, but not in trait > 2) Abstract classes are fully interoperable with Java. You can call them > from Java code without any wrappers. Traits are fully interoperable only if > they do not contain any implementation code for scala 2.11. > 3) you can do multiple inheritance or mixin composition with trait. > > In the TableEnvironment case, > 1) I don't see a need for mixin, and class hierarchy seems fit better here > by design. > 2) to better interoperate with Java from scala 2.11, it's better to use > abstract class. (But AFAIK, scala 2.12 and java 8 would be compatible, > though) > 3) you might pay a bit performance overhead with trait (compiled to > interface) compared to abstract class, but it's not a big deal here. > > But in other cases, trait might be a better one if it might be reused and > mixined in multiple, unrelated classes. > > So another option would be to refactor TableEnvironment to clean up or move > the 'private[flink]' or 'protected' stuff to the actual implementor > (e.g. 'InternalTableEnvironment') as > you would do for your trait approach for TableEnvironment. I think this > option might help with backward compatibility as well. Thanks. > > Shuyi > > On Fri, Mar 2, 2018 at 10:25 AM, Rong Rong <walter...@gmail.com> wrote: > > > Hi Timo, > > > > Thanks for looking into this Timo. It's becoming increasingly messy for > my > > trying to locate the correct functions in IDE :-/ > > > > This is probably due to the fact that Scala and Java access modifiers / > > qualifiers are subtly and fundamentally different. Using Trait might be > the > > best solution here. Another way I can think of is to move the all > > TableEnvironment classes to Java side, but that would probably introduce > a > > lot of issue we need to resolve on the Scala side though. "protected" is > > less restrictive in Java but there's really no equivalent of package > > private modifier on Java. > > > > I was wondering is there any better way to provide backward-compatible > > support though. I played around with it and seems like every "protected" > > field will create a private Java member and a public getter, should we > add > > them all and annotate with "@Deprecated" ? > > -- > > Rong > > > > On Thu, Mar 1, 2018 at 10:58 AM, Timo Walther <twal...@apache.org> > wrote: > > > > > Hi everyone, > > > > > > I'm currently thinking about how to implement FLINK-8606. The reason > > > behind it is that Java users are able to see all variables and methods > > that > > > are declared 'private[flink]' or even 'protected' in Scala. Classes > such > > as > > > TableEnvironment look very messy from the outside in Java. Since we > > cannot > > > change the visibility of Scala protected members, I was thinking about > a > > > bigger change to solve this issue once and for all. My idea is to > convert > > > all TableEnvironment classes and maybe the Table class into traits. The > > > actual implementation would end up in some internal classes such as > > > "InternalTableEnvironment" that implement the public traits. The goal > > would > > > be to stay source code compatible. > > > > > > What do you think? > > > > > > Regards, > > > Timo > > > > > > > > > > > > -- > "So you have to trust that the dots will somehow connect in your future." >