Java 链式编程 和 lombok 实现链式编程

一、什么是链式编程

1、链式编程定义

链式编程的原理就是返回一个this对象,就是返回本身,达到链式效果。

我们经常用的 StringBuffer 就是 实现了链式的写法。

StringBuffer builder = new StringBuffer();
builder.append("blake").append("bob").append("alice").append("linese").append("eve");

是不是很方便呢!

怎么实现呢,其实就是在设置的 返回当前的对象

2、查看 jdk 中 StringBuffer 源码:

public final class StringBuilder  extends ... {

    // ...省略代码...
    
    public StringBuilder append(String str) {
        super.append(str);
        return this;             // 返回this
    }
  
    private StringBuilder append(StringBuilder sb) {
        if (sb == null)
            return append("null");
        int len = sb.length();
        int newcount = count + len;
        if (newcount > value.length)
            expandCapacity(newcount);
        sb.getChars(0, len, value, count);
        count = newcount;
        return this;           // 返回this
    }
  
    public StringBuilder append(StringBuffer sb) {
        super.append(sb);
        return this;			// 返回this
    }
 
    public StringBuilder delete(int start, int end) {
        super.delete(start, end);
        return this;			// 返回this
    }
 
    public StringBuilder deleteCharAt(int index) {
        super.deleteCharAt(index);
        return this;			// 返回this
    }
  
    public StringBuilder replace(int start, int end, String str) {
        super.replace(start, end, str);
        return this;			// 返回this
    }   
    
    public StringBuilder insert(int offset, String str) {
        super.insert(offset, str);
        return this;			// 返回this
    }
  
    public int indexOf(String str) {
        return indexOf(str, 0);			// 返回this
    }   
   
    public int lastIndexOf(String str) {
        return lastIndexOf(str, count);		// 返回this
    }
   
    public StringBuilder reverse() {
        super.reverse();
        return this;						// 返回this
    }

    public String toString() {      
        return new String(value, 0, count);			// 返回this
    }
}

3、按照上面的方法写一个例子:

public class StudentBean {
	private String name;
	private int age;

	public String getName() {
		return name;
	}

	public StudentBean setName(String name) {
		this.name = name;
		return this;		// 返回this
	}

	public int getAge() {
		return age;
	}

	public StudentBean setAge(int age) {
		this.age = age;
		return this;		// 返回this
	}
}

测试:

public class Main {

	public static void main(String[] args) {
		
		StudentBean studentBean = new StudentBean().setAge(22).setName("ly");
		System.out.println(studentBean.getAge());
		System.out.println(studentBean.getName());
	}
}

二、 lombok 链式编程

lombok 能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。

2.1、依赖

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.16.14</version>
	<scope>provided</scope>
</dependency>

2.2、lombok 实现静态的链式编程

我们把这个 bean 改成 lombok 实现只需要加上一个 @Accessors(chain = true) 即可。

import lombok.*;
import lombok.experimental.Accessors;

@Accessors(chain = true)
@Data
public class StudentBean {
	private String name;	
	private int age;
	
}

这样代码简洁多了 ,而且实现了链式编程。
在这里插入图片描述

测试代码与上面的代码完全一样。

三、静态的链式编程

静态的链式编程 比 普通的链式编程 的好处:

  • 创建对象更简洁;
  • 可以在静态方法、静态代码块等中使用;
  • 对于必输字段,可以强制要求。

对比:

特点静态的链式编程普通的链式编程
创建对象更简洁对象.静态方法()new 对象()
可以在静态方法、静态代码块等中使用
对于必输字段,可以强制要求。对象.静态方法(param)if( xxx ){ ...}

3.1、lombok 实现静态的链式编程

比如,创建 StudentBean 对象时,有时会要求一些必输字段,比如name字段必须有值。

1)如果自己编写代码实现静态的链式编程。

代码如下:

import lombok.NonNull;

public class StudentBean {
 
	private String name;  
	private int age;
	
	
	private StudentBean(String name) {   //默认构造方法置为 private
	  	this.name = name;
	}
	
	public static StudentBean getInstance(String name) {  //唯一的 public 构造方法,name 不能为空
	 	if (name == null)
	    	throw new NullPointerException("name is not null"); 
	  	return new StudentBean(name);
	}  
	
	//------------  getter/setter  --------------
	public StudentBean setName(String name) { 
	  	this.name = name;
	  	return this;   // 返回this
	}
	
	public StudentBean setAge(int age) {
	 	this.age = age;
	  	return this;   // 返回this
	}  
	
	public String getName() {
	  	return this.name;
	} 
	
	public int getAge() {
	  	return this.age;
	}  
	
	public String toString() {
	  	return "StudentBean(name=" + getName() + ", age=" + getAge() + ")";
	}
}

上面是自己编写静态的链式编程。 如果使用 lombok 注解,则代码更加简洁。

2) 使用 lombok 注解 实现静态的链式编程

代码如下:

import lombok.*;
import lombok.experimental.Accessors;

@Accessors(chain = true)
@Data
@RequiredArgsConstructor(staticName = "getInstance")   //指定构造方法 
public class StudentBean {

	@NonNull
	private String name;
	
	private int age;
}

3) 探究 lombok 注解的原理

@RequiredArgsConstructor 究竟做了什么,我们通过 StudentBean.class 反编译(整理后)可以看到 :

import lombok.NonNull;

public class StudentBean {

	  @NonNull
	  private String name;  
	  private int age;
	  
	   // 默认构造方法置为 private
	  private StudentBean(@NonNull String name) { 
		    if (name == null)
		      	throw new NullPointerException("name"); 
		    this.name = name;
	  }
	  
	   //唯一的 public 构造方法,name 不能为空
	  public static StudentBean getInstance(@NonNull String name) { 
	    	return new StudentBean(name);
	  }
	  	

	  //------------  getter/setter  --------------
	   public StudentBean setName(@NonNull String name) {
		   if (name == null)
		      throw new NullPointerException("name"); 
		   this.name = name;
		   return this;         // 返回this
	  }  
	  
	  public StudentBean setAge(int age) {
		  this.age = age;
		  return this;         // 返回this
	  }
	  
	  @NonNull
	  public String getName() {
	   	 return this.name;
	  }
	  
	  public int getAge() {
	  	  return this.age;
	  }

	 public String toString() {
	    return "StudentBean(name=" + getName() + ", age=" + getAge() + ")";
	 }

  	 // -- 省略 equals,canEqual ,hashCode--- 	
}
  • 默认构造方法置为 private ;
  • 唯一的、指定为public的 getInstance 构造方法,要求 name 不能为空。

4)测试方法:

public class Main {	
	public static void main(String[] args) {		
		StudentBean studentBean = StudentBean.getInstance("zhangsan").setAge(22);
		System.out.println(studentBean.getAge());
		System.out.println(studentBean.getName());
	}
}

这样不仅实现了链式编程,还实现了静态创建。

四、builder模式的链式Bean

4.1、自定义 builder模式的链式Bean

build模式实现原理为在bean里面创建一个 静态builder方法 和一个 静态内部Builder类 ,通过调用静态builder方法来创建 Builder类,然后通过 builder类 中的 build方法直接创建一个Bean,具体如下:

public class StudentBean {
	private String name;
	
	private int age;
 
	public String getName() {
		return name;
	} 
	public void setName(String name) {
		this.name = name;
	} 
	public int getAge() {
		return age;
	} 
	public void setAge(int age) {
		this.age = age;
	}
		
	public static Builder builder() {
		return new Builder();
	}
	
	public static class Builder{
		private String name;
		
		private int age;
 
		public Builder name(String name) {
			this.name = name;
			return this;
		}
 
		public Builder age(int age) {
			this.age = age;
			return this;
		}
		
		public StudentBean build() {
			StudentBean studentBean = new StudentBean();
			studentBean.setName(name);
			studentBean.setAge(age);
			return studentBean;
		}
	}
}

测试方法:

StudentBean studentBean = StudentBean.builder().name("zhangsan").age(11).build();

4.2、lombok 实现 builder模式的链式bean

这样就实现了一个builder模式的链式bean。其实用lombok就一个注解的事情,调用与上面同样

import lombok.*;

@Builder
@Data
public class StudentBean {
	private String name;
	
	private int age;
}
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值