我正在尝试新型的Dart FFI来制造libsodium的包装纸。 Libsodium需要通过调用init()
进行初始化。但是我不认为应该让用户负担沉重的负担,而且我也不想检查某些全局状态变量。
我知道Go具有软件包init()
的功能,这些功能在包含软件包时运行。 Dart中有类似的东西吗?
当然,我可以将所有内容包装到一个类中并在构造函数中运行init()
,但是实例化一个基本上只公开静态方法的类没有太大意义。此外,我想保留libsodium的程序样式。
答案 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
。