dart 可以初始化库吗?

gudnpqoy  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(168)

我正在尝试新的Dart FFI来为libsodium制作 Package 器。需要通过调用init()来初始化Libsodium。但是我不认为用户应该有负担来记住这一点,我也不想检查一些全局状态变量。
我知道Go语言有init()包函数,当一个包被包含进来的时候就会运行。Dart中有类似的东西吗?
当然,我可以把所有东西都打包成一个类,然后在构造函数中运行init(),但是初始化一个基本上只公开静态方法的类没有多大意义,此外,我希望保留libsodium的过程化风格。

nwlls2ji

nwlls2ji1#

当然,我可以把所有东西都打包成一个类,然后在构造函数中运行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)的顶级函数相比,调用者看起来没有任何不同。

vjhs03f7

vjhs03f72#

Dart没有隐式运行代码的方法。在main之前没有代码运行,并且所有在main之后运行的代码都这样做,因为它是直接或间接从main方法调用的。
如果您需要初始化某些内容,有许多选项。

  • 您可以使用延迟初始化的静态变量:
var _initialState = _init();
int doSomething(arguments) {
  _initialState;
  do the something.
}

阅读_initialState将确保init在第一次需要时被调用,而不是在那之后。您甚至可以在状态中存储内容以供以后使用。

  • jamesdlin建议的单例实现对象。它基本上做同样的事情,然后把方法放在对象上而不是静态的。另一个变体就是这样做,但是使用一个私有示例,并把公共顶级函数转发给单例对象。然后你得到过程API,并仍然确保状态对象被初始化。(这可能更适合测试,允许您同时拥有多个活动状态对象)。
  • 要求人们拨打init

相关问题