渡されたデータの加工
慣れるまで分かりにくいものに、参照型と値型というのがあります。
int や char が「値型」で、それ以外はだいたい「参照型」です。
毎度、管理人イガジーです。
「配列」は(int 配列でも)参照型になります。
このエントリの参考ソースでは、
int []a;
RoundRR(int []x) {
a=x;
と、渡された配列をフィールド変数に代入しています。
このやり方は、好みが分かれるといいますか
「けしからん」とか「美しくないやり方」と思う人もいるでしょう。
a=x; とした後で、例えばa[0]=1; などとすると
x[0]にも1 が代入されます。
a も x も同じ実体(オブジェクト)を指しているからです。
class RoundRR は、渡された配列を直接更新する仕様になっています。
クラスというものは、独立性を持つべきだ(カプセル化するべきだ)
という考え方からすると、反則的な処理です。
渡されるx[]の内容を変更しないという仕様にするには
配列の中身をコピーして、dispa には 加工したa[]を
渡すようにする必要があるでしょう。
配列の中身をコピーする(コピーして別の実体を作る)には
a=x.clone(); を使います。
(c[]に中身をコピーするのに、c=x.clone();を使っています)
clone() した配列の値を変更しても、元の配列(x[])には
影響はありません。別の実体を指しているからです。
メソッドに渡すものが、配列ではなくて int などの値型の場合は
メソッド内でいくらその値を変更しても、元の値には影響は
ありません。例えば、
void func(int d) {
d=d+10;
}
というメソッドがあったとして、
int t=10;
func(t);
としても(func()内でd+10されても)t は10のままです。
と説明してみたものの、最初のうちはさっぱり分からないかもしれません。
たとえ、分からなくてもあせらずに、時間を置いてまた
読みなおしてみてください。そのうちわかってくると思います。
この記事へのコメントはこちら