• [置顶] 把长方形的构造函数写的文艺点儿


    文艺是一种感受,它来自路过看的人。

    代码也如此,代码文艺不文艺,首先要从client code看。

    假设我们想要实现一个长方形的构造函数,怎么能写的文艺点儿呢?


    1.普通青年直接用构造函数

    当你看到 new Rectangular(2.0, 4.0)的时候,你知道2.0和4.0是什么意思吗?

    幸运的是这个类只有两个构造参数,还不算太猛。

    如果类的field太多,只有进入Rectangular的类实现去看了。像我这种记性不好的,说不定一会儿就要看下,隔一会儿又要看下。



    public class Rectangular {

        private final double length;
        private final double width;

        public Rectangular(double length, double width) {
            this.length = length;
            this.width = width;
        }
    }



    2.文艺青年用builder

            rectangular()
                    .length(2.0)
                    .width(4.0);

    这样的调用,不用再怀疑,我传入的是length还是width了。这里使用的是builder模式。

    builder是一种常用的建造对象的设计模式,GoF,Effective Java中都有讲。对于多个field的类,builder是一种不错的选择。


    public class Rectangular {
        private double length;
        private double width;

        public static Rectangular rectangular() {
            return new Rectangular();
        }

        public Rectangular length(double length) {
            this.length = length;
            return this;
        }

        public Rectangular width(double width) {
            this.width = width;
            return this;
        }
    }



    3.文艺青年用嵌套方法

    rectangular(length(2.0), width(4.0));

    比起Method Chaining的方式,嵌套的方法不再使用Fluent Interface。


    public class Rectangular {
        private final double length;
        private final double width;

        private Rectangular(double length, double width) {
            this.length = length;
            this.width = width;
        }

        public static double length(double length) {
            return length;
        }

        public static double width(double width) {
            return width;
        }

        public static Rectangular rectangular(double length, double width) {
            return new Rectangular(length, width);
        }
    }


    虽然length和width不能限制他传入的一定是相应的类型。但是也提供了一种可选的方法。

    同时,当对象出现层次时,这种组织方式将变得更清晰。这是因为括号自己就可以显示出这样的层次。

    比如:

            container(
                    rectangular(length(2.0), length(4.0)),
                    rectangular(length(1.0), length(3.0))
            )

    这一点儿,是单纯使用第二种方法做不到或者不容易做到的。


    也许你会说,你妹哦,我还不如写个json或者其他什么plain text来构造container。

    恩,你这样想的话,就有点儿到点子上了。


    多的不说了,上面的三种方式仅供参考,文艺和2B也只是一线之间。


  • 相关阅读:
    Andorid手机振动器(Vibrator)的使用
    Log.i()的用法
    刀哥多线程现操作gcd-10-delay
    刀哥多线程全局队列gcd-09-global_queue
    刀哥多线程Barrier异步gcd-08-barrier_async
    刀哥多线程同步任务作用gcd-07-sync_task
    刀哥多线程之主队列gcd-06-main_queue
    刀哥多线程之并发队列gcd-05-dispatch_queue_concurrent
    刀哥多线程串行队列gcd-04-dispatch_queue_serial
    刀哥多线程之03GCD 常用代码
  • 原文地址:https://www.cnblogs.com/java20130722/p/3206823.html
Copyright © 2020-2023  润新知