Dart工厂和几个主要功能

时间:2013-05-05 18:05:29

标签: dart

我目前正在开发一个用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

1 个答案:

答案 0 :(得分:2)

两个独立的程序不能相互影响(除了通过文件和套接字等IO操作)。

从我可以看到你用两个不同的程序执行V​​M两次。他们的图书馆将完全独立。想象一下,一个具有全局状态的重要库(如您提到的惰性工厂构造函数)存储在系统目录中。如果每个程序的库都没有重复,那么完全独立的程序就会相互干扰。

另一种看待它的方法:VM为每个程序创建一个新的(隐式)隔离。程序有自己的副本和内存。即使在同一个程序中,您也只能通过消息传递在两个隔离区之间进行通信(每个消息都被序列化和反序列化)。两个隔离区也有不同的缓存工厂构造函数。