Wem sein “getter/setter”-Boilerplatecode in seinen Domainenobjekten auf die Nerven geht, sollte sich mal das Project Lombok ansehen!

Nachdem man die Bibliothek eingebunden hat, werden mit @Annotations an den Objekten im Hintergrund die getter/setter sowie hashcode, toString und equals generiert. Das Schöne daran ist auch, das die Klasse leer bleibt, jedoch der Outline-View in Eclipse alle Methoden anzeigt.

Als Beispiel hier mal mein Domänenobjekt ohne Lombok (100 Zeilen):

package de.test.domain;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.hibernate.Hibernate;

public class User  implements java.io.Serializable
{

	private Integer id;
	private String name;
	private String surname;
	private String username;
	private String password;
	private Boolean active;
	private String email;

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSurname() {
		return this.surname;
	}

	public void setSurname(String surname) {
		this.surname = surname;
	}

	public String getUsername() {
		return this.username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return this.password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Boolean getActive() {
		return this.active;
	}

	public void setActive(Boolean active) {
		this.active = active;
	}

	public String getEmail()
	{
		return email;
	}

	public void setEmail(String email)
	{
		this.email = email;
	}

	@Override
	public int hashCode()
	{
		return new HashCodeBuilder(17,37).append(this.getUsername()).toHashCode();
	}

	@Override
	public boolean equals(Object other)
	{
		if(this == other)
			return  true;
		if (other == null || Hibernate.getClass(this) != Hibernate.getClass(other))
			return false;

		final User rhs = (User) other;
		return new EqualsBuilder().append(this.getUsername(),rhs.getUsername()).isEquals();
	}

	@Override
	public String toString()
	{
		return "User [active=" + active + ", name=" + name + ", email=" + email + ", password="
		              + password + ", surname=" + surname + ", username=" + username
		              + "]";
	}
}

..und hier mein Domänenobjekt mit Lombok (21 Zeilen):

package de.test.domain;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@EqualsAndHashCode(exclude={"id","name","surname","password","active","email"})
@ToString(exclude="id")
public class User  implements java.io.Serializable
{

	private @Getter @Setter  Integer id;
	private @Getter @Setter  String name;
	private @Getter @Setter  String surname;
	private @Getter @Setter  String username;
	private @Getter @Setter  String password;
	private @Getter @Setter  Boolean active;
	private @Getter @Setter  String email;

}

Hier das Objekt in Eclipse:

Lombok im Eclipse-View

Lombok im Eclipse-View

Man könnte jetzt in der Lombokmagie ein Problem sehen, allerdings sehe ich eher das Problem darin, das wir langsam von der XML-Hell geradewegs in die @Annotation-Hell kommen…


Tags: