今後のクラスのユーザにも、そのクラスで書かれた将来のコードからアクセッサメソッド(junitやそれに類するもの)。強制的にprivateクラスへのアクセスを同じクラスからjava内のメソッドに限定する
Javaでこれを行う方法はありますか?可能であれば誰かが例を見せてくれる?
今後のクラスのユーザにも、そのクラスで書かれた将来のコードからアクセッサメソッド(junitやそれに類するもの)。強制的にprivateクラスへのアクセスを同じクラスからjava内のメソッドに限定する
Javaでこれを行う方法はありますか?可能であれば誰かが例を見せてくれる?
強制することはできませんが、javadocでメソッドを作成し、その強制を文書化することができます。
private int myMember;
/**
* ATTENTION: use this method instead of setting the member directly.
*/
public void setMyMember(int value) {
this.myMember = value;
}
また、別の解決方法があります。次のようにThreadLocalを使用してください:
private final ThreadLocal<String> member = new ThreadLocal<String>();
public void setMember(final String value) {
member.set(value);
}
メンバーフィールドは最終的なものであり、変更することはできません。そのため、クライアントはセッターに直接電話する必要があります。
同じクラスのアクセスについては、プライベートメンバーに直接アクセスするだけでなく、そのメンバーにアクセスする方法もあります。 基本的に、同じクラスのメンバーを直接使用することはできません。
リフレクションを防止する場合は、SecurityManagerを使用できます。これがオプションでない場合は、Thread.currentThread()。getStackTrace()を呼び出して呼び出しスタックを取得し、呼び出し側がクラスから来ていることを確認できます。
これには2つの問題があります。パフォーマンスは大きくはありません。あなたが外部で行うことができる方法でできることは何も、最も単純な回避策はチェックなしでその内容をコピーすることです。 ;)
このようにアクセスを許可しない理由を文書化することをお勧めします。
これを行う標準的な方法はありません。ユーザーがクラスインスタンスにアクセスできる場合、プライベートメンバーはプライベートと宣言されますが、実行時にアクセス権を変更してアクセスできます。
権限を強制するクラスローダーが必要です。 OSGiバンドルを作成し、インターフェイスを介してサービスとしてエクスポートされたオブジェクトのインスタンスに対して制御ポリシーを適用することができます。しかし、これはあなたのアプリケーションを実行するOSGiコンテナにつなぎます。
フィールドを非表示にするには、継承を使用してください:
それについては考えましたが、使用法は制限されています。「子クラス」は「親クラス」内の他のプライベートフィールドにアクセスできません。これはショーストッパーになる可能性があります。 –
許可するアクセス権を 'protected'に変更してください!しかし、常に良いアイデアであり、ゲッター/セッター(より多くのセッター)を利用することができます。なぜなら、バリデーションやそのようなことができるからです。 –
フィールドがクラスの一部である限り、誰でも直接アクセスできます。これは、すべての(共同)作成者がゲッター/セッターを通過するように強制しようとすると問題になる可能性があります。なぜなら、これらのメソッドは変換、チェック、または簿記を行うからです。内部カウンターをインクリメントするのと同じです。
一般的な解決策は、注釈を使用することで可能であることに気付いています。
@GetterSetterAccessOnly
private int value;
まあ、彼らが持っている場合:あなたは、それはフィールドが、それ以外で使用されている場合、コンパイル時エラーでゲッター/セッターメソッドだと、注釈(アノテーションプロセッサ・コード)を確保するために作成する必要があるだろうあなたのコードへのアクセスは、彼らが望むことを何でもすることができます。最悪の場合、彼らはあなたのゲッターとセッターを削除し、だけではなく、公共の場に置く;)
しかし、もちろん、あなたが応じてデザインを直接変数にアクセスしないようにそれらに動機を与えることができます。
Javadocは、仕事が最も好むアプローチです。 ;) –
これはセキュリティを作成しません!他の答えを見てください。 –
代替ソリューションはセキュリティを作成します。 –