可以初始化库吗?

时间:2019-06-02 12:55:36

标签: dart

我正在尝试新型的Dart FFI来制造libsodium的包装纸。 Libsodium需要通过调用init()进行初始化。但是我不认为应该让用户负担沉重的负担,而且我也不想检查某些全局状态变量。

我知道Go具有软件包init()的功能,这些功能在包含软件包时运行。 Dart中有类似的东西吗?

当然,我可以将所有内容包装到一个类中并在构造函数中运行init(),但是实例化一个基本上只公开静态方法的类没有太大意义。此外,我想保留libsodium的程序样式。

2 个答案:

答案 0 :(得分:2)

  

当然,我可以将所有内容包装到一个类中并在构造函数中运行init(),但是实例化一个基本上只公开静态方法的类没有太大意义。此外,我想保留libsodium的程序样式。

您可以拥有一个单例实例,并将库函数作为实例中的方法公开,并且可以提供一个自动进行初始化的公共getter函数。

例如,类似:

Libsodium _instance;
Libsodium get libsodium => instance ??= Libsodium._();

class Libsodium {
  Libsodium._() {
    // Do initialization.
  }

  void foo() { ... }
  void bar() { ... }
}

,然后呼叫者需要通过以下方式使用它:

import 'libsodium.dart';

libsodium.foo();

这将隐藏类的实例化,并且与调用方的外观没有什么不同,与仅使用带有名称空间(import 'libsodium.dart' as libsodium)的顶级函数的情况一样。

答案 1 :(得分:1)

Dart没有任何隐式运行代码的方法。没有代码在main之前运行,而所有在main之后运行的代码都这样做,因为它们是直接或间接从main方法调用的。所以,不。

如果您需要初始化某些内容,则有很多选项。

  • 您可以使用延迟初始化的静态变量:

    var _initialState = _init();
    int doSomething(arguments) {
      _initialState;
      do the something.
    }
    

    读取_initialState将确保第一次调用init 它是必需的,而不是在那之后。您甚至可以将状态存储为 以后使用。

  • @jamesdlin建议的单例实现对象。它基本上做到了 同样的事情,然后将方法放在对象上而不是静态的。 另一个变体是精确地做到这一点,但是具有私有实例,并且具有 公共顶级函数转发到单例对象。然后你得到 程序API,并且仍然确保状态对象已初始化。 (这可能是更好的测试方法,它允许您激活多个状态对象 同时)。

  • 要求人们打电话给init