查看了很多介绍new命令的说明,感觉没有搞懂,特别记录一下自己的探索记录和结果。
结论: new命令只对特别的类Not ProcedureBlock有意义| 普通类ProcedureBlock | 类[Not ProcedureBlock] |
|---|---|
| 变量同其他语音的理解 | 变量不同其他语音的理解 |
| 变量只在方法作用域内有效 | 变量在这个类域有效 |
| B方法无法获取A方法的私有变量; B方法同名变量是私有的,不影响A的值。 方法传参的情况,B方法接收的是形参 | 当前进程的类域。 同一个进程,类方法的任何地方,可以获取到之前的定义的类变量。 |
| 方法里面使用 New | 方法里面使用 New |
| 没有使用场景 ,使用的时候报错,Private variable not allowed : ‘(a)’ | 见下表 |
特殊类的情况 [Not ProcedureBlock]
类里面所有的变量都相当于变成 public static 的类变量
还是同Java不一样;是当前进程的类的static变量。任何方法的操作,其他方法获取的都是变量的最新值。大家再同一个域,相互影响。
| new | new param1 | new (param1) |
|---|---|---|
| 完全新开一个new域,所有变量都不影响类域;不能访问任何类域的变量;同名的变量不相互影响。 | 使当前方法,开一个新的new域,里面存 新的变量 param1 ;是一个单独的域,不影响类域里面的变量。当前方法可以查看,new 域里面的变量,和类域里面的变量。同名变量,new 域优先类域。 | 使当前方法,开一个新的域,当前方法,只可以访问类域的 param1 变量,不能访问类域里面的其他变量。 |
| 使用场景 | ||
| 一个独立的方法;不用使用任何类变量,也不用入参。这样方法产生的变量,也不需要加入类域 | param1 是方法里面的临时变量,例如循环的i;不需要加入类域的。 | 入参是param1 ,希望他是引用型变量,其他任何定义的变量都是临时变量。 |
这里面说的类域,还是同Java不一样;是当前进程的类域。同一个进程,类方法的任何地方,可以获取到之前的定义的类变量。Java的是系统启动,static类成员变量即可访问了。所有进程共用。
代码测试特别强调,以下方法都是对类 [ Not ProcedureBlock ] 而言
Class Test.NewCommand1 Extends %RegisteredObject [ Not ProcedureBlock ]
{....}
没有new命令
/// d ##class(Test.NewCommand1).testA()
ClassMethod testA()
{
s a = 1
s b = 2
w "var in A "
zw // a=1 b=2
w !
d ..testB()
w "var in A "
zw // a=1 b=B c=C
w !
}
ClassMethod testB()
{
w "var in B "
zw // a=1 b=2
w !
s a = "B"
s c = "C"
w "var in B "
zw // a=1 b=B c=C
w !
}
new 命令
/// d ##class(Test.NewCommand1).testAN()
ClassMethod testAN()
{
s a = 1
s b = 2
w "var in A "
zw // a=1 b=2
w !
d ..testBN()
w "var in A "
zw // a=1 b=2
w !
}
ClassMethod testBN()
{
new
w "var in B "
zw // 无变量
w !
s a = "B"
w "var in B "
zw // a=B
w !
}
new param1
/// d ##class(Test.NewCommand1).testA2()
ClassMethod testA2()
{
s a = 1
s b = 2
w "var in A "
zw // a=1 b=2
w !
d ..testB2(a)
w "var in A "
zw // a=1 b=2
w !
}
ClassMethod testB2(a)
{
new a
w "var in B "
zw // b=2
w !
s a = "B"
w "var in B "
zw // a=B b=2
w !
}
new (param1)
/// d ##class(Test.NewCommand1).testA1()
ClassMethod testA1()
{
s a = 1
s b = 2
w "var in A "
zw // a=1 b=2
w !
d ..testB1(a)
w "var in A "
zw // a=B b=2
w !
}
ClassMethod testB1(a)
{
new (a)
w "var in B "
zw // a=1
w !
s a = "B"
s c = "c"
w "var in B "
zw // a=B c=c
w !
}



