从 5.2 开始,aviatorscript 支持 use 语句,类似 java 里的 import 语句,可以导入 java 类到当前命名空间,减少在 new 或者 try…catch 等语句里写完整报名的累赘方式。 use 语句的使用方式多种,最简单的情况是导入单个 Java 类:
## examples/new.avuse java.util.Date;let d = new Date();p(type(d));p(d);
use 包名.类名 就可以导入任意一个类到当前上下文。
如果要导入某个包下面的任意类,可以用通配符 * :
## examples/use.avuse java.util.*;let list = new ArrayList(10);seq.add(list, 1);seq.add(list, 2);p("list[0]=#{list[0]}");p("list[1]=#{list[1]}");let set = new HashSet();seq.add(set, "a");seq.add(set, "a");p("set type is: " + type(set));p("set is: #{set}");
我们把 java.util 包下的类都导入,因此可以直接 new 一个 ArrayList 或者 HashSet,并使用:
list[0]=1list[1]=2set type is: java.util.HashSetset is: [a]
如果你只是想引入包下的数个类,而不是全部,可以通过 use 包名.{类1, 类2...} 的方式,看一个更复杂的例子
use java.util.concurrent.locks.{ReentrantLock, ReentrantReadWriteLock};use java.util.concurrent.CountDownLatch;let x = 0;let n = 10;let lk = new ReentrantLock();let latch = new CountDownLatch(n);for i in range(0, n) {let t = new Thread(lambda() ->lock(lk);x = x + 1;unlock(lk);countDown(latch);p("thread #{i} done");end);start(t);}await(latch);p("x=#{x}");let lk = new ReentrantReadWriteLock();let wlk = writeLock(lk);lock(wlk);x = x + 1;unlock(wlk);p("x=#{x}");
我们使用 ReentranLock 来保护变量 x ,并且使用 CountDownLatch 来同步所有线程执行完成。接下来我们用 ReentrantReadWriteLock 读写锁来保护 x 。可以看到 use java.util.concurrent.locks.{ReentrantLock, ReentrantReadWriteLock}; 这一行代码导入了两个 Lock 类。
执行输出:
thread 4 donethread 5 donethread 2 donethread 0 donethread 3 donethread 1 donethread 6 donethread 7 donethread 8 donethread 9 donex=10x=11null
