通过apt自动生成建造者模式单线程版代码(一)

不知道你是否和我一样有代码洁癖,不知道你是否和我一样有同种类型的代码洁癖.

下面描述一下我的症状,当我看见有完全相同的调用逻辑时,总有一种难以言表的不适,有一种强烈的,想把重复的逻辑抹去的冲动.

最初是怎么解决的呢?

比如说这样一个类


public class TestBean {
    String messageA;
    String messageB;
    
    public String getMessageA() {
        return messageA;
    }
    
    public void setMessageA(String messageA) {
        this.messageA = messageA;
    }
    
    public TestBean(String messageA, String messageB) {
        this.messageA = messageA;
        this.messageB = messageB;
    }
    
    public String getMessageB() {
        return messageB;
    }
    
    public void setMessageB(String messageB) {
        this.messageB = messageB;
    }
}

如果我需要调用他的方法逻辑的时候,只能通过这样的方式

private void test() {
    this.setMessageA("A");
    this.setMessageB("B");
}

一般人感觉很正常,这不就是面向对象的基本数据操作方式吗,很简单啊,也很正常,没有违和感啊.

但是你有没有觉得这样还是很废话吗?我知道java的特点之一就是易上手,但是同时,易上手的含义就是包含了很多为了让人更好入门的重复逻辑和方法,或者说是表达方式和字段

我理想中的语言是一切信息只出现过一次即可,不需要进行重复暗示,这才是计算机,这才是智能不是吗?好了,扯远了,回过来看看我们今天的主题.

最开始我想到的方法是函数式编程,看看能不能简单一些,但是当我知道了RxJava,才发现其实有人已经玩过这条路了,而且玩的很不错.基本的操作是不断地在其实doOnNext方法中去执行对操作对象的操作.

具体的操作方式是这样的,OK...实例化对象的确消失了,但是引入了更长的方法名和形参,捡了芝麻丢了西瓜,得不偿失,就没有一点意思了.

扫描二维码关注公众号,回复: 8490555 查看本文章
private void test1() {
    Flowable.just(1)
            .doOnNext(integer -> {
            }).doOnNext(integer -> {});
}

那么,有没有一种方法能够实现这样的效果呢?或者说能平息我的洁癖症的方法到底是什么呢?经过一番思索我想到了.可能是因为最近在看android插件化的适配问题,这给了我一些灵感吧

首先是思路,通过建造者模式,因为这个模式相当顺滑,其次是能实现链式调用的效果.

先给出效果,在后续的文章中我再给出实际的实现方式.当然,你会说,我吃了空啊,等你的Builder类代码写完,天都黑了!我还是乖乖地多写几个字母都比写这种样式好.

好吧,如果你这么觉得,我不建议你看下去,勤奋的程序员啊,真的建议你学会偷懒.只有懂得节约才能更好地挥霍,这个道理浅显易懂.

@BuilderClass
public class TestA {
    int a;
    int b;
    
    public static void main(String[] arg) {
        TestA testA = new TestA(1, 2);
        testA.subBuilder()
                .setA(2)
                .setB(4);
    }
    
    public int getA() {
        return a;
    }
    
    public void setA(int a) {
        this.a = a;
    }
    
    public int getB() {
        return b;
    }
    
    public void setB(int b) {
        this.b = b;
    }
    
    public TestA(int a, int b) {
        this.a = a;
        this.b = b;
    }
    
    public SubTestA subBuilder() {
        return SubTestA.__create(this);
    }
}

的确,这样的方式的确很傻,那么有没有方法能解决这个问题呢?

当然有啦,不然我写这个文章不是浪费大家时间呢= =

发布了298 篇原创文章 · 获赞 25 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_31433709/article/details/102934344