Skip to content

by lazy和lazy

1.前言

委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。

在java中的委托模式:

java
  public class Car {
        public int getCarColor(){
              return 0;
        }
  }
  public class Benz {
         public int getCarColor(){
              return new Car().getCarColor();
        }
  }
  public static void main(String[] args){
        int color =  new Benz().getCarColor();
  }

java中的委托的进阶示例

java
  public interface BaseCar {
       int getCarColor();
       String getCarName();
       boolean[] isCarDoorOpens();
       boolean isCarDoorOpen(int i);
  }
  public class Car{
       public int getCarColor(){return 0;}
       public String getCarName(){return "Car"}
       public boolean[] isCarDoorOpens(){
            retunr new boolean[]{false,false.false,false};
       }
       public boolean isCarDoorOpen(int i){
            return new boolean[]{false,false.false,false}[i];
       }
  }
  public class Benz implements BaseCar{
       private Car car = new Car();
       public int getCarColor(){return this.car.getCarColor();}
       public String getCarName(){return "Benz"}
       public boolean[] isCarDoorOpens(){
            retunr this.car.isCarDoorOpens();
       }
       public boolean isCarDoorOpen(int i){
            return this.car.isCarDoorOpen(i);
       }
  }
  public static void main(String[] args){
        int color =  new Benz().getCarColor();
  }

在这个例子中,类Benz实现了BaseCar,但是除了getCarName方法,其他方法都是调用另一个实现了BaseCar的类Car的方法。而这种一个类的方法是调用另一个类的方法,就是委托。在java中当一个接口有很多种方法时,实现委托就得不厌其烦的反复写this.car.method(args)。

Kotlin中引入了by关键字来实现这种委托。

像前面Java在类Benz中那么多实现委托的代码,在Kotlin中直接一行搞定:

kotlin
class Benz (car:Car):BaseCar by car{

}

委托需要个委托人吧,那类委托是不是也要个委托类?所以你懂了没?

我知道你想问,那我有些方法不想委托怎么办?

怎么办?上代码:

kotlin
      class Benz (car:Car):BaseCar by car{
               override fun getCarName():String { return "Benz" }
      }

简单来说,就是不需要委托哪个方法,就重写哪个方法咯!

至于by lazy,懒加载,大致相当于Java的

java
   OneInterface oi = new OneInterface(){
        public int method(){
             return oneInterfaceImp.method();
        }
   }

只是说kotlin简化了写法:

kotlin
   val oneInterface:OnInterface by lazy {
        OnInterfaceImp()
   }

同样,不想委托的方法,在lazy{}中重写就可以。

Released under the MIT License.