gpt4 book ai didi

static - 是否可以使用 Dart 执行静态代码?

转载 作者:行者123 更新时间:2023-12-02 01:35:58 25 4
gpt4 key购买 nike

Java 和 Javascript 都允许以不同的方式执行静态代码。 Java 允许您在类主体中包含静态代码,而 JS 允许您在类定义之外执行静态代码。示例:

Java:

public class MyClass {
private static Map<String,String> someMap = new HashMap<String,String();
static {
someMap.put("key1","value");
someMap.put("key2","value");
SomeOtherClass.someOtherStaticMethod();
System.out.println(someMap);
}
}

JS(基本上是类之外的任何 JS 代码):

var myint = 5;
callSomeMethod();
$(document).ready(function () {
$("#hiddenelement").hide();
});

但是,Dart 似乎支持这两种方式中的任何一种。支持声明全局变量和方法,但不支持像JS中那样调用方法和执行代码。这只能在 main() 方法中完成。另外,类中也不允许有静态代码。

我知道 Dart 有其他方法来静态填充 Map,就像我的第一个示例一样,但我能想到另一种情况需要这样做。

让我们考虑以下 CarRegistry 实现,它允许您将汽车模型的字符串映射到相应类的实例。 F.e.当您从 JSON 数据获取汽车模型时:

class CarRegistry {
static Map<String, Function> _factoryMethods = new HashMap<String, Function>();

static void registerFactory(String key, Car factory()) {
_factoryMethods[key] = factory;
}

static Car createInstance(String key) {
Function factory = _factoryMethods[key];
if(factory != null) {
return factory();
}
throw new Exception("Key not found: $key");
}
}

class TeslaModelS extends Car {

}

class TeslaModelX extends Car {

}

为了能够调用 CarRegistry.createInstance("teslamodelx");,必须首先注册该类。在 Java 中,可以通过向每个 Car 类添加以下行来完成:static { CarRegistry.registerFactory("teslamodelx", () => new TeslaModelX()); }。您不希望将所有汽车硬编码到注册表中,因为这将失去注册表的功能,并且会增加耦合。您希望仅通过添加一个新文件即可添加一辆新车。在 JS 中,您可以在类构造之外调用 CarRegistry.registerFactory("teslamodelx", () => new TeslaModelX()); 行。

如何在 Dart 中完成类似的事情?

即使您允许编辑多个文件来添加新车,如果您编写的库没有 main() 方法,也是不可能的。那么唯一的选择是在第一次调用 Registry.createInstance() 方法时填充 map ,但它不再是注册表,而只是一个包含硬编码汽车列表的类。

编辑:对我在这里所做的最后一句话的一个小补充:如果注册表驻留在createInstance()方法中,则填充这种注册表只是一个选项我自己的图书馆。如果,f.e.我想将我自己的类注册到我导入的另一个库提供的注册表中,这不再是一个选项。

最佳答案

为什么对静态如此大惊小怪?您可以创建一个 getter 来检查初始化是否已完成 (_factoryMethods != null),如果没有完成并返回映射。

据我了解,这就是关于应该在什么时间执行该代码的问题。

我上面展示的方法是延迟初始化。
我认为这通常是我认为的首选方式。
如果你想在库加载时进行初始化
我不知道从 main() 调用库的 init() 方法并添加此库 init() 初始化代码的另一种方法> 方法。

这是关于此主题的讨论executing code at library initialization time

关于static - 是否可以使用 Dart 执行静态代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21338444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com