【问题标题】:The difference between the use of constructor " className() and className._()使用构造函数“className() 和 className._() 的区别
【发布时间】:2020-01-08 17:51:13
【问题描述】:

我有这两种方法来编写构造函数。 className()className._()

它们之间有什么区别,我应该什么时候使用?

 class GlobalState{

      final Map<dynamic,dynamic> _data=<dynamic,dynamic>{};
      static GlobalState instance = new GlobalState._();

      GlobalState._();
    }
    //In Main Class 
       GlobalState _store=GlobalState.instance;

    and 

    class GlobalState{

      final Map<dynamic,dynamic> _data=<dynamic,dynamic>{};
      static GlobalState instance = new GlobalState();
    }
    //In Main Class 
       GlobalState _store=GlobalState();

【问题讨论】:

  • GlobalState._() 将构造函数设为私有,这意味着您不能使用它从外部实例化对象。而GlobalState() 是一个可以从任何地方实例化的常规构造函数。

标签: flutter dart


【解决方案1】:

你知道在 java 中没有像命名构造函数这样的工具。但 dart 提供命名构造函数。 每当您想创建更多 2 个构造函数选择时,您应该在类中创建命名构造函数。 就像您在代码中所做的那样

【讨论】:

    【解决方案2】:

    例如:

    class MyClass {
      MyClass();
    
      MyClass.named();
    
      MyClass._private();
    
      MyClass._();
    }
    

    上面的类有四个构造函数:

    • MyClass():这是默认,未命名的构造函数。当您设计类时,您希望它表明它是人们应该大部分使用的构造函数。使用它更方便,因为它涉及的输入更少。
    • MyClass.named():这是一个 named 构造函数。也许您希望您的类具有多个构造函数,以便可以以不同的方式构造您的类的实例。 Dart 不支持重载函数,所以如果你想要多个构造函数,它们需要不同的名称。因此,如果您需要多个构造函数,则需要命名其中一些以区分它们。即使您没有多个构造函数,您也可能需要一个明确的名称以避免歧义。
    • MyClass._private():在 Dart 中,以下划线开头的名称对于 Dart 库(通常表示 .dart 文件)私有MyClass._private() 只是一个命名构造函数,不能在库之外使用。通常,当类想要强制调用者使用公共工厂构造函数(或静态方法)来获取实例时,您会看到私有构造函数,尤其是当类想要拥有单个实例时。
    • MyClass._():这相当于MyClass._private()。它不是默认构造函数,它仍然是一个私有的命名构造函数(即,调用者必须使用MyClass._() 来调用它)。这是类作者想要一个私有构造函数但不想选择名称的情况。 (命名很难。)

    【讨论】:

    • 很好的答案,虽然它应该更新以匹配空安全更新。 stackoverflow.com/questions/62544746/…
    • @Brandon Pillay 我不明白,因为这个答案中的任何内容都不受空安全性的影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多