美文网首页
从Java 到 Dart

从Java 到 Dart

作者: 城平京 | 来源:发表于2019-05-24 11:03 被阅读0次

    1 Dart中的Int 相当于Java中的包装类型,其实Dart中一切都是对象,没有Java中的基本数据类型

    void main() {
        int count;
        print(count);
    }
    
    count = null
    

    2 定义字符串既可以使用单引号,也可以使用双引号,这个和JavaScript一致,和Java不一样

    3 数组(在Dart中是List,因为Dart中一些都是对象,所以也没有Java中的数组了)和Map和JavaScript一致, 另外还有Set类型(元素不重复)

    var names = ['张三','李四','王五']; // List
    
    var gifts= {
        'first':'partridge',
        'second':'turtledoves',
        'fifth': 'golden rings'
    }
    
    var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'}; // Dart2.2 中才引入了 Set 字面量 
    

    List Set Map这些容器类都支持泛型,并且都可以用const修饰,定义成编辑期常量

    4 有闭包(函数内部访问外包的变量,外包的变量无法得到释放)

    5 没有===,这个和Java一致

    6 数字类型只有int 和 double

    7 构造函数, 和Java很接近

    class Point {
        num x, y;
      // Syntactic sugar for setting x and y
      // before the constructor body runs.
        Point(this.x, this.y);
    }
    
    void main() {
      var point = new Point(3, 4);
      print("x : ${point.x}");
      print("y : ${point.y}");
    }
    

    这样写构造函数其实是一种语法糖,完整写法是

      Point(num x, num y) {
        this.x = x;
        this.y = y;
      }
    

    8 命名构造函数,我的理解就是有名字的构造函数,JAVA中的构造函数没有名字,因此经常会用静态工厂方法来创建对象,在Dart中改进了这一点

    class Point {
      num x, y;
    
      // The main constructor for this class.
      Point(this.x, this.y);
    
      // Delegates to the main constructor.
      Point.alongXAxis(num x) : this(x, 0);
    }
    
    
    void main() {
      
      var point = Point.alongXAxis(4);
      print("x : ${point.x}");
      
    }
    

    9 ?.和is 运算符,这个和Kotlin一致

    10 创建一个Class的时候new是可选的,new Point(2, 2) 等同于 Point(2, 2)这个和Kotlin类似,不过Kotlin是强制省略
    更新一下new 在Dart2中已经是不推荐的了,为得是Flutter声明布局的时候更清晰

    Widget build(BuildContext context) {
      return Row(
        children: [
          RaisedButton(
            child: Text('Increment'),
          ),
          Text('Click!'),
        ],
      );
    }
    

    不推荐

    Widget build(BuildContext context) {
      return new Row(
        children: [
          new RaisedButton(
            child: new Text('Increment'),
          ),
          new Text('Click!'),
        ],
      );
    }
    

    11 const 构造函数,相当于创建一个不可变类的实例,一旦创建,类中的属性都不可以改变,个人非常喜欢的一种设计,
    如果需要改变属性,可以重新创建一个新的实例
    同样在Dart2中const也建议尽量在常量上下文的环境中省去

    const primaryColors = [
      Color("red", [255, 0, 0]),
      Color("green", [0, 255, 0]),
      Color("blue", [0, 0, 255]),
    ];
    

    不推荐

    const primaryColors = const [
      const Color("red", const [255, 0, 0]),
      const Color("green", const [0, 255, 0]),
      const Color("blue", const [0, 0, 255]),
    ];
    

    12 常量对象?JAVA中好像没有类似的实现,有点接近于static 代码块(这个特性可以用来实现享元模式,用来实现类似java中的integer缓存了-128 到 127)

    class User {
      final String name;
      
      const User(this.name);
    }
    
    
    void main() {
      
     var a = const User("Dean");
     var b = const User("Dean");
     print(a==b); // true
      
    }
    

    注意上面的代码如果把User前的const去掉,就会打印false了

    13 级联符号 .. 一种语法糖,帮你省去创建临时变量的步骤,不知道有多少人会用,反正我估计是不会去用,我建议大家也别去用,可读性不好

    querySelector('#confirm') // Get an object.
      ..text = 'Confirm' // Use its members.
      ..classes.add('important')
      ..onClick.listen((e) => window.alert('Confirmed!'));
    

    等价于

    var button = querySelector('#confirm');
    button.text = 'Confirm';
    button.classes.add('important');
    button.onClick.listen((e) => window.alert('Confirmed!'));
    

    14 const 编译期常量,final 只能赋值一次,这个和java也差不多,只不过JAVA编辑期常量用的是 static

    15

    相关文章

      网友评论

          本文标题:从Java 到 Dart

          本文链接:https://www.haomeiwen.com/subject/catgzqtx.html