私はC++のバックグラウンドから来て、Javaの不変な機能について疑問を抱いていました。関数の戻り値はconstとして指定できますか? (戻り値が変更できないことを意味します)Javaにおける戻り値の値
また、ボーナスポイントの場合、関数定義には、関数がクラスレベル値を変更しないことを示すconstとしてpostfix'edすることができます。これはJavaでも可能ですか? (定義によって関数がクラスの状態を内部的に変更できないことを意味します)
ありがとうございます!
私はC++のバックグラウンドから来て、Javaの不変な機能について疑問を抱いていました。関数の戻り値はconstとして指定できますか? (戻り値が変更できないことを意味します)Javaにおける戻り値の値
また、ボーナスポイントの場合、関数定義には、関数がクラスレベル値を変更しないことを示すconstとしてpostfix'edすることができます。これはJavaでも可能ですか? (定義によって関数がクラスの状態を内部的に変更できないことを意味します)
ありがとうございます!
いいえ、Javaのfinal
はC++のconst
と大きく異なります。あなたはあなたが尋ねたことのいずれかをすることはできません。
オブジェクトを変更不能にするには、C++のようにコンパイラのヘルプを登録するのではなく、それを強制することが多かれ少なかれです。からhttp://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html:
次の規則は、不変オブジェクトを作成するための簡単な方法を定義します。 ...
- フィールドで参照されるフィールドまたはオブジェクトを変更するメソッドである「セッター」メソッドを使用しないでください。
- すべてのフィールドを
final
とprivate
にする。- サブクラスがメソッドをオーバーライドできないようにします。これを行う最も簡単な方法は、クラスを
final
と宣言することです。より洗練されたアプローチ は、コンストラクタprivate
を作成し、ファクトリ のメソッドでインスタンスを構築することです。- インスタンスフィールドは変更可能なオブジェクトへの参照が含まれている場合、それらのオブジェクトを変更することはできません。
- は変更可能なオブジェクトを変更するメソッドを提供しないでください。
- 変更可能なオブジェクトへの参照を共有しないでください。コンストラクタに渡された外部の変更可能なオブジェクトへの参照を保存しないでください。 が必要な場合は、コピーを作成し、コピーへの参照を保存します。 同様に、 があなたのメソッドでオリジナルを返さないようにする必要がある場合、内部可変オブジェクトのコピーを作成します。
wow ...それはひどい。状態を保護するには、Javaでは多くの作業が必要です。週末のお返事ありがとう! –
@JonathanDunlap私は状態を保護する方法は、本質的にあなたが戻ってほしいもののコピーである新しいオブジェクトを返すことだと思います。 – Troyseph
はありません、実際にどこかのうち不変オブジェクトを作成する方法はありません。 何か不変であることを望むならば、それはツリー全体に沿って不変(最終)でなければなりません。
次の例は、(ルートのを除く)すべての場所で、最終的な使用していますが、それでもすべての変更を防止することができません。
public class justAnInt {
public int a = 0;
public int b = 0;
}
// -----------------------------------
public class AliasProblem{
private final justAnInt var = new justAnInt();
final justAnInt getVar()
{
return var;
}
public static void main(String argv[])
{
final AliasProblemObject = new AliasProblem();
final justAnInt localVar = AliasProblemObject.getVar();
localVar.a = 19;
System.out.println("object: " + object.getVar().a);
System.out.println("local: " + localVar.a);
}
}
私はあなたが読書のためのオブジェクトデータのコピーを返すので、変更されてからそれらを保護することができると思います。しかし余分なコピーは不変であるために大きい価格のようである。
Javaでは、言語の副作用がはるかに簡単なことは何も価値がないので、コードの最適化に同じヒントを与える必要はありません。 –
[Javaに定数キーワードがないのはなぜですか?](http://stackoverflow.com/questions/2735736/why-is-there-no-constant-keyword-in-java) –