从 5.2 开始,aviatorscript 支持 use 语句,类似 java 里的 import 语句,可以导入 java 类到当前命名空间,减少在 new 或者 try…catch 等语句里写完整报名的累赘方式。 use
语句的使用方式多种,最简单的情况是导入单个 Java 类:
## examples/new.av
use java.util.Date;
let d = new Date();
p(type(d));
p(d);
use 包名.类名
就可以导入任意一个类到当前上下文。
如果要导入某个包下面的任意类,可以用通配符 *
:
## examples/use.av
use 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]=1
list[1]=2
set type is: java.util.HashSet
set 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 done
thread 5 done
thread 2 done
thread 0 done
thread 3 done
thread 1 done
thread 6 done
thread 7 done
thread 8 done
thread 9 done
x=10
x=11
null