单例和静态类
目前来看静态构造函数就是比较好的办法了,单例和基类的操作目前有点用不太到,毕竟也没什么共享的变动数据,基类的话,只有一个服务,强行去写反而有点过度设计。综合来看,下周的优化方向就是静态构造函数的方式。不过写基类以后有机会可以试试看,往里面放那些会复用的方法或者属性,让多次使用的时候子类直接继承就可以免去重写。但前提是真的有复用,不然就是过度设计了。
单例和静态类最大的区别就是,前者仍然是一个类,封装、继承、多态的特性都在;但后者就真是纯粹的方法了,只是上面套了个class的皮。静态本身就意味着从定义开始就不可变动,其内容必须是固定的,那就别说什么继承和更改这种。
关于封装这里,看上去包在类里像是有封装,但本质上里面的静态变量是整个程序的全局变量。而类就不一样了,类的实例单独处理自身作用域内的变量,而每次new出来的都是初始化内容。当然单例就比较特殊,这算是恰巧差不多了,但拿来处理当下的情况正合适。
静态最大的问题就是有静态依赖:如果一个地方用了静态,那就相当于构建了一个隐藏的全局依赖——只要一改,牵一发动全身。这就是为啥静态的最佳使用场景是字面意义上的「静态」时刻,比如单个使用的工具方法,或者是真的需要全局维持一致的静态变量。一旦动态对象依赖了静态对象,那这就会成为一个瓶颈,也会成为耦合的来源。比如十个动态对象都依赖于这个静态时,静态一动就全完——如果有个变量是可变的状态,那就不要用静态。除
非是只读的,或者说是希望不实例化就直接调用的工具方法(而且也得无状态,否则如果这个函数也以来一个可变静态,那就还是带上了静态依赖)。滥用静态的问题会很严重,使用之前一定要考虑副作用。比如DI,在没必要用静态的地方就可以不用,否则把静态变量当DI的做法完全是坏味道。DI本来就是为了去耦合,结果又上个注入的静态对象给耦合上了,这是搞毛线。