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

BELUGA BEHR commented on HBASE-19682:
-------------------------------------

[~appy] I would simply point out that the List Add method is 
[optional|https://docs.oracle.com/javase/8/docs/api/java/util/List.html#add-E-].
  So if one does not know the source of the list, by convention and good 
encapsulation, they should not be adding to it anyway, but instead adding it's 
contents to a new list.

{code}
List<Foo> results = new ArrayList<> ();
results.addAll(getBaseFoos());
results.add(myfoo1);
results.add(myfoo2);
{code}

The JDK provides this emptyList mechanism for us to take advantage of.  No 
memory overhead, fast comparisons with ==, JVM hot-spot potential.  There are 
times where we may even wish to turn an otherwise mutable list into an 
[un-modifiable|https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#unmodifiableList(java.util.List)]
 list.  The JavaDoc can provide the answers if we expand their usage.  If you 
really want to be conservative, we can wrap all return values in an 
unmodifiableList so that the caller gets an immutable list no matter the 
outcome of the method (empty or otherwise) and include that note in the 
JavaDoc.  In practice though, I just don't think it's a good idea to *ever* be 
relying on the underlying function's return value to be the right collection 
type.  Maybe the method returns a LinkedList and now we're stuck adding objects 
to it when we would otherwise prefer an ArrayList... maybe it's some sort of 
home-brew List implementation that is completely whacky.  Don't ever trust it 
and blindly add items to it.  Add the return value to a List that you know and 
love, as was provided in the previous example.  Simple rule to follow; No 
problems.

There is reference to this in the book Effective Java, Third Edition; Joshua 
Bloch.  They suggest that Collections.empty() may be a pre-mature optimization, 
but provide no qualms about it in regards to mutability.  The example from the 
book is as follows:

{code}
// Optimization - avoids allocating empty collections
public List<Cheese> getCheeses() {
    return cheesesInStock.isEmpty() ? Collections.emptyList()
        : new ArrayList<>(cheesesInStock);
}
{code}



> Use Collections.emptyList() For Empty List Values
> -------------------------------------------------
>
>                 Key: HBASE-19682
>                 URL: https://issues.apache.org/jira/browse/HBASE-19682
>             Project: HBase
>          Issue Type: Improvement
>          Components: hbase
>    Affects Versions: 3.0.0
>            Reporter: BELUGA BEHR
>            Assignee: BELUGA BEHR
>            Priority: Minor
>         Attachments: HBASE-19682.1.patch, HBASE-19682.2.patch, 
> HBASE-19682.3.1.patch
>
>
> Use {{Collection.emptyList()}} for returning an empty list instead of 
> {{return new ArrayList<> ()}}.  The default constructor creates a buffer of 
> size 10 for _ArrayList_ therefore, returning this static value saves on some 
> memory and GC pressure and saves time not having to allocate a new internally 
> buffer for each instantiation.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to