我目前正在开发一个用dart取代JavaScript的网站。我希望为普通用户隐藏一些代码,并为登录的用户显示一些其他代码。我的想法是(至少)有两个带有main()
函数的dart文件,一个可见,一个隐藏到普通用户。现在我有一个工厂返回缓存实例的类。但是,此实例不会从一个文件缓存到另一个文件。如何在两个不同的dart文件中获取相同的实例?
编辑:代码示例
档案file1.dart
import "some_lib.dart";
main(){
var a = new A("string1");
print(a.string);
}
档案file2.dart
import "some_lib.dart";
main(){
var a = new A("string2");
print(a.string);
}
档案some_lib.dart
library some_lib;
class A{
String string;
static A _cached;
factory A(String s){
if(_cached == null){
_cached = new A._internal(s);
}
return _cached;
}
A._internal(this.string);
}
档案index.html
<!DOCTYPE html>
<html>
<head>
<script type="application/dart" src="file1.dart"></script>
<script type="application/dart" src="file2.dart"></script>
<script type="text/javascript" src="packages/browser/dart.js"></script>
</head>
<body>
<h1>THIS IS DARTA</h1>
</body>
</html>
我希望打印
string1
string1
在控制台中,但我得到了
string1
string2
答案 0 :(得分:2)
两个独立的程序不能相互影响(除了通过文件和套接字等IO操作)。
从我可以看到你用两个不同的程序执行VM两次。他们的图书馆将完全独立。想象一下,一个具有全局状态的重要库(如您提到的惰性工厂构造函数)存储在系统目录中。如果每个程序的库都没有重复,那么完全独立的程序就会相互干扰。
另一种看待它的方法:VM为每个程序创建一个新的(隐式)隔离。程序有自己的副本和内存。即使在同一个程序中,您也只能通过消息传递在两个隔离区之间进行通信(每个消息都被序列化和反序列化)。两个隔离区也有不同的缓存工厂构造函数。