百家争鳴Javaは閉パッケージを導入する必要がありますか?
まず、閉パッケージとは何かを調べてみましょう.
クローズド・パッケージは、自由(バインドされていない)変数を含むことができるコード・ブロックです.これらの変数は、このコード・ブロックまたは任意のグローバル・コンテキストで定義されるのではなく、コード・ブロックを定義する環境で定義されます.「クローズド・パッケージ」という言葉は、実行するコード・ブロックの結合に由来します.(自由変数の存在により、関連変数参照は解放されません)と、自由変数にバインドされた計算環境(役割ドメイン)が提供されます.
上の定義は少し難しいかもしれませんが、「Pythonコアプログラミング」の閉パッケージの解釈を見てみましょう.
1つの内部関数で外部役割ドメイン(グローバル役割ドメインではない)の変数を参照すると、内部関数は閉パッケージとして定義されます.外部関数内に定義されているが、内部関数によって参照されているか、または使用されている変数は自由変数と呼ばれます.
以下は閉パッケージの例です(Javaは現在閉パッケージをサポートしていないため、この閉パッケージの例はPythonで書かれています.『Pythonコアプログラミング』を参照してください)
ここでcount変数は関数incrに対する自由変数(関数incrの外部作用ドメインにあるが、グローバル作用ドメインにはない)であり、内部関数incrはこの変数を参照して使用することができる.この例は主にカウンタをシミュレートする.
次のコードを実行
Javaコード
14 count = counter(6)
15 print count()
16 print count()
17
18 count = counter(6)
19 print count()
20 print count()
印刷されます
7
8
内部関数(incr)は、自身が定義した変数だけでなく、外部関数(counter)が定義した変数も参照できることが分かった.あるいは、内部関数(閉パッケージ)は、その記憶状態に応じて異なる操作を実行できる状態を記憶することができ、外部関数は状態(内部関数が記憶する必要がある状態)の初期化を担当する.
では、なぜ閉鎖が必要なのか、閉鎖のメリットは何なのか.記憶できる状態だと思いますが、しかし、オブジェクトは状態を記憶することもできます(オブジェクトの属性によって).では、閉パケットとオブジェクトの違いは何ですか?閉パケットはオブジェクトではなく関数だと思います.オブジェクト向けに閉パケット内部関数を表現すると(閉パッケージ)オブジェクトのメソッドと同様に、外部関数オブジェクトのコンストラクタです.コンストラクタはオブジェクトの状態を初期化するために使用され、オブジェクトのメソッドはオブジェクトの状態に応じて異なる操作を実行できます.
よし!次に、オブジェクト向けにカウンタを作成します(前例と同様の機能を実装し、Javaで実装します).
Testクラスの実行
印刷されます(前述の印刷出力と同じです)
7
8
ではJava(オブジェクトがある)は閉パッケージを導入する必要がありますか?不要だと思います.オブジェクトは閉パッケージの行為を完全にシミュレートすることができ、オブジェクトこそOOPの一級要素です.閉パッケージは関数式プログラミング(FP)の概念であり、閉パッケージを導入することはFPを導入することに相当し、Javaの純粋さと簡単さを破壊するだけです.
クローズド・パッケージは、自由(バインドされていない)変数を含むことができるコード・ブロックです.これらの変数は、このコード・ブロックまたは任意のグローバル・コンテキストで定義されるのではなく、コード・ブロックを定義する環境で定義されます.「クローズド・パッケージ」という言葉は、実行するコード・ブロックの結合に由来します.(自由変数の存在により、関連変数参照は解放されません)と、自由変数にバインドされた計算環境(役割ドメイン)が提供されます.
上の定義は少し難しいかもしれませんが、「Pythonコアプログラミング」の閉パッケージの解釈を見てみましょう.
1つの内部関数で外部役割ドメイン(グローバル役割ドメインではない)の変数を参照すると、内部関数は閉パッケージとして定義されます.外部関数内に定義されているが、内部関数によって参照されているか、または使用されている変数は自由変数と呼ばれます.
以下は閉パッケージの例です(Javaは現在閉パッケージをサポートしていないため、この閉パッケージの例はPythonで書かれています.『Pythonコアプログラミング』を参照してください)
def counter(start_at = 0):
count = [start_at]
def incr():
count[0] += 1
return count[0]
return incr
def counter(start_at = 0):
count = [start_at]
def incr():
count[0] += 1
return count[0]
return incr
ここでcount変数は関数incrに対する自由変数(関数incrの外部作用ドメインにあるが、グローバル作用ドメインにはない)であり、内部関数incrはこの変数を参照して使用することができる.この例は主にカウンタをシミュレートする.
次のコードを実行
Javaコード
14 count = counter(6)
15 print count()
16 print count()
17
18 count = counter(6)
19 print count()
20 print count()
印刷されます
7
8
内部関数(incr)は、自身が定義した変数だけでなく、外部関数(counter)が定義した変数も参照できることが分かった.あるいは、内部関数(閉パッケージ)は、その記憶状態に応じて異なる操作を実行できる状態を記憶することができ、外部関数は状態(内部関数が記憶する必要がある状態)の初期化を担当する.
では、なぜ閉鎖が必要なのか、閉鎖のメリットは何なのか.記憶できる状態だと思いますが、しかし、オブジェクトは状態を記憶することもできます(オブジェクトの属性によって).では、閉パケットとオブジェクトの違いは何ですか?閉パケットはオブジェクトではなく関数だと思います.オブジェクト向けに閉パケット内部関数を表現すると(閉パッケージ)オブジェクトのメソッドと同様に、外部関数オブジェクトのコンストラクタです.コンストラクタはオブジェクトの状態を初期化するために使用され、オブジェクトのメソッドはオブジェクトの状態に応じて異なる操作を実行できます.
よし!次に、オブジェクト向けにカウンタを作成します(前例と同様の機能を実装し、Javaで実装します).
public class Counter {
private int startAt;
public Counter() {
this(0);
}
public Counter(int startAt) {
this.startAt = startAt;
}
public int incr(){
return ++ this.startAt;
}
}
public class Counter {
private int startAt;
public Counter() {
this(0);
}
public Counter(int startAt) {
this.startAt = startAt;
}
public int incr(){
return ++ this.startAt;
}
}
Testクラスの実行
public class Test{
public static void main(String[] args){
Counter counter = new Counter(6);
System.out.println(counter.incr());
System.out.println(counter.incr());
}
}
public class Test{
public static void main(String[] args){
Counter counter = new Counter(6);
System.out.println(counter.incr());
System.out.println(counter.incr());
}
}
印刷されます(前述の印刷出力と同じです)
7
8
ではJava(オブジェクトがある)は閉パッケージを導入する必要がありますか?不要だと思います.オブジェクトは閉パッケージの行為を完全にシミュレートすることができ、オブジェクトこそOOPの一級要素です.閉パッケージは関数式プログラミング(FP)の概念であり、閉パッケージを導入することはFPを導入することに相当し、Javaの純粋さと簡単さを破壊するだけです.