[ 
https://issues.apache.org/jira/browse/IMPALA-7867?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16691195#comment-16691195
 ] 

Paul Rogers edited comment on IMPALA-7867 at 11/19/18 2:43 AM:
---------------------------------------------------------------

[~marcelk], thanks much for the note. The guarantees you site for {{ArrayList}} 
are accurate. This is why, when _creating_ a list, {{ArrayList}} is often a 
good choice.

However, when _declaring_ a list, the interface is sufficient. Though a 
variable is declared as {{List}}, its implementation is actually {{ArrayList}} 
if declared that way.

Not sure if this is a difference between Java and C++ behavior, but it is 
pretty standard Java practice to hind the implementation choice and expose only 
the generic interface.

Example:

{code:java}
public class Foo {
  // Declaration is generic, implementation is ArrayList
  private final List<Bar> myList_ = new ArrayList<>();

  // Interface is generic
  List<Bar> getList() { return myList_; }

  // Implementation in terms of generic interface, implementation
  // is O(1) as guaranteed by ArrayList.
  void Bar getBar(int i) {
    return myList_.get(i);
  }
}
{code}

Later, we could decide, say, to change the semantics so that the list is 
immutable and use a new {{ImmutableArrayList}} as the implementation. Consumers 
of the class don't care, they still see {{List}} (but now backed by a different 
implementation.)

For more information, please see the [collection 
docs|https://docs.oracle.com/javase/8/docs/technotes/guides/collections/overview.html].

Does this clear up the confusion?



was (Author: paul.rogers):
[~marcelk], thanks much for the note. The guarantees you site for {{ArrayList}} 
are accurate. This is why, when _creating_ a list, {{ArrayList}} is often a 
good choice.

However, when _declaring_ a list, the interface is sufficient. Though a 
variable is declared as {{List}}, its implementation is actually {{ArrayList}} 
if declared that way.

Not sure if this is a difference between Java and C++ behavior, but it is 
pretty standard Java practice to hind the implementation choice and expose only 
the generic interface.

Example:

{code:java}
public class Foo {
  // Declaration is generic, implementation is ArrayList
  private final List<Bar> myList_ = new ArrayList<>();

  // Interface is generic
  List<Bar> getList() { return myList_; }

  // Implementation in terms of generic interface, implementation
  // is O(1) as guaranteed by ArrayList.
  void Bar getBar(int i) {
    return myList_.get(i);
  }
}
{code}

Does this clear up the confusion?


> Expose collection interfaces, not implementations
> -------------------------------------------------
>
>                 Key: IMPALA-7867
>                 URL: https://issues.apache.org/jira/browse/IMPALA-7867
>             Project: IMPALA
>          Issue Type: Improvement
>          Components: Frontend
>    Affects Versions: Impala 3.0
>            Reporter: Paul Rogers
>            Assignee: Paul Rogers
>            Priority: Minor
>
> When using Java collections, a common Java best practice is to expose the 
> collection interface, but hide the implementation choice. This pattern allows 
> us to start with a generic implementation (an {{ArrayList}}, say), but evolve 
> to a more specific implementation to achieve certain goals (a {{LinkedList}} 
> or {{ImmutableList}}, say.)
> For whatever reason, the Impala FE code exposes {{ArrayList}}, {{HashMap}} 
> and other implementation choices as variable types and in method signatures.
> This ticket tracks a gradual process of revising the declarations and 
> signatures to use the interfaces {{List}} instead of the implementation 
> {{ArrayList}}.
> Also, the FE code appears to predate Java 7, so that declarations of lists 
> tend to be in one of two forms (with or without Guava):
> {code:java}
> foo1 = new ArrayList<Bar>();
> foo2 = Lists.newArrayList();
> {code}
> Since Java 7, the preferred form is:
> {code:java}
> foo = new ArrayList<>();
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-all-unsubscr...@impala.apache.org
For additional commands, e-mail: issues-all-h...@impala.apache.org

Reply via email to