构造函数“className()和className._()的使用区别

问题描述 投票:0回答:3

我有这两种方法来编写构造函数。

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();
flutter dart
3个回答
33
投票

考虑一下,例如:

class MyClass {
  MyClass();

  MyClass.named();

  MyClass._private();

  MyClass._();
}

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

  • MyClass()
    :这是默认,未命名的构造函数。当您设计类时,您希望这表明它是人们在大多数情况下应该使用的构造函数。使用它更方便,因为它需要更少的打字。
  • MyClass.named()
  • :这是一个
    named
    构造函数。也许您希望您的类具有多个构造函数,以便可以以不同的方式构造您的类的实例。 Dart 不支持重载函数,因此如果需要多个构造函数,则需要使用不同的名称来区分它们。即使您没有多个构造函数,在某些情况下您也可能需要一个显式名称,以避免其所采用的位置参数含糊不清(例如 Rectangle.fromLTRB)。
  • MyClass._private()
  • :在 Dart 中,以下划线开头的非本地名称对于 Dart 库来说是
    private
    (通常表示 .dart 文件)。
    MyClass._private()
    只是一个命名构造函数,不能在库外部使用。常见的用途是当类:
    想要强制调用者使用
      重定向构造函数
    • ,重定向到不太符合人体工程学的私有构造函数。 并不意味着直接实例化,例如如果类想要强制调用者使用公共
    • factory
    • 构造函数(或
      static
      方法)来获取实例,特别是如果类想要拥有单个实例或者如果想要禁止子类化。
      根本不打算被实例化。
  • MyClass._()
  • :这没什么特别的;它与
    MyClass._private()
    相同,但名称不同。它不是默认构造函数,它仍然是私有的命名构造函数(即调用者必须使用
    MyClass._()
    来调用它)。在这种情况下,类作者想要一个私有构造函数,但不想选择一个名称。 (命名事物很难。)
    
    
  • 你知道在java中没有像命名构造函数这样的工具。但 dart 提供了命名构造函数。 每当你想创建更多 2 个构造函数选择时,你应该在类中创建命名构造函数。 就像你在代码中所做的那样

1
投票

唯一的区别是一个是公共/普通构造函数,另一个是私有构造函数。


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.