Howdy all,

I was wondering what the teams thoughts are on using Lombok?

https://projectlombok.org/

Lombok is a tool that uses annotations at *compile time* to dynamically
generate the boilerplate code for things like getters, setters, basic
constructors, toString, equals, etc...
There are no actual code changes to the source, so its not a traditional
generator.  It uses the internal
To me it has been a very helpful time saver for coding and maintenance and
it allows for us to avoid missing things.

A good look at how it works in IntelliJ and Eclipse is here:
https://www.javacodegeeks.com/2016/06/lombok-compile-time-java-annotation-preprocessor-minimize-code-size.html

But as a quick example of using this for a very simple class and a single
@Data annotation takes:

package org.apache.sentry;

import lombok.Data;

@Data
public class SimpleBean {
  private final String name;
  private int age;
  private double score;
  private String[] tags;
}

and turn it effectively into

package org.apache.sentry;

public class SimpleBean {
  private final String name;
  private int age;
  private double score;
  private String[] tags;

  @java.beans.ConstructorProperties({"name"})
  public SimpleBean(String name) {
    this.name = name;
  }

  public String getName() {
    return this.name;
  }

  public int getAge() {
    return this.age;
  }

  public double getScore() {
    return this.score;
  }

  public String[] getTags() {
    return this.tags;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public void setScore(double score) {
    this.score = score;
  }

  public void setTags(String[] tags) {
    this.tags = tags;
  }

  public boolean equals(Object o) {
    if (o == this) {
      return true;
    }
    if (!(o instanceof SimpleBean)) {
      return false;
    }
    final SimpleBean other = (SimpleBean) o;
    if (!other.canEqual((Object) this)) {
      return false;
    }
    final Object this$name = this.getName();
    final Object other$name = other.getName();
    if (this$name == null ? other$name != null :
!this$name.equals(other$name)) {
      return false;
    }
    if (this.getAge() != other.getAge()) {
      return false;
    }
    if (Double.compare(this.getScore(), other.getScore()) != 0) {
      return false;
    }
    if (!java.util.Arrays.deepEquals(this.getTags(), other.getTags())) {
      return false;
    }
    return true;
  }

  public int hashCode() {
    final int PRIME = 59;
    int result = 1;
    final Object $name = this.getName();
    result = result * PRIME + ($name == null ? 43 : $name.hashCode());
    result = result * PRIME + this.getAge();
    final long $score = Double.doubleToLongBits(this.getScore());
    result = result * PRIME + (int) ($score >>> 32 ^ $score);
    result = result * PRIME + java.util.Arrays.deepHashCode(this.getTags());
    return result;
  }

  protected boolean canEqual(Object other) {
    return other instanceof SimpleBean;
  }

  public String toString() {
    return "SimpleBean(name=" + this.getName() + ", age=" +
this.getAge() + ", score=" + this
        .getScore() + ", tags=" +
java.util.Arrays.deepToString(this.getTags()) + ")";
  }
}


There are more helper functions in the library for things like Builders,
and Synchronized.

What do you guys think about using this in Sentry?

-=Brian

-- 
*Brian Towles* | Software Engineer
t. (512) 415- <0000000000>8105 e. btow...@cloudera.com <j...@cloudera.com>
cloudera.com <http://www.cloudera.com/>

[image: Cloudera] <http://www.cloudera.com/>

[image: Cloudera on Twitter] <https://twitter.com/cloudera> [image:
Cloudera on Facebook] <https://www.facebook.com/cloudera> [image: Cloudera
on LinkedIn] <https://www.linkedin.com/company/cloudera>
------------------------------

Reply via email to