You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@reef.apache.org by "WooYeonLee (JIRA)" <ji...@apache.org> on 2016/05/15 01:53:12 UTC

[jira] [Created] (REEF-1390) Make Optional's toString() and hashCode() computed on demand

WooYeonLee created REEF-1390:
--------------------------------

             Summary: Make Optional's toString() and hashCode() computed on demand
                 Key: REEF-1390
                 URL: https://issues.apache.org/jira/browse/REEF-1390
             Project: REEF
          Issue Type: Improvement
          Components: REEF
            Reporter: WooYeonLee
            Priority: Minor
             Fix For: 0.15


{{Optional}}'s constructor preloads {{valueStr}} and {{valueHash}} for its {{toString()}} and {{hashCode()}} methods respectively, even when those methods never be invoked during the life of the object.

{code}
  private Optional(final T value) {
    this.value = value;
    this.valueStr = "Optional:{" + value + '}';
    this.valueHash = value.hashCode();
  }
{code}

It incurs unnecessary overhead, and the problem becomes worse if the size of T is huge and T's hashcode() requires heavy computation.

They should be done in {{toString()}} and {{hashCode()}} methods on demand, respectively like below:
{code}
  private Optional(final T value) {
    this.value = value;
  }

  @Override
  public String toString() {
    return "Optional:{" + this.value + '}';
  }

  @Override
  public int hashCode() {
    return this.value.hashCode();
  }
{code}

+As a related issue, when {{value}} is null, it's better to return a reference of a {{static}} variable for empty Optional, not making separated objects every time. The following is the current code.
{code}
  public static <T> Optional<T> empty() {
    return new Optional<>();
  }
{code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)