2011-09-14 7 views

答えて

3

強制することはできませんが、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); 
} 

メンバーフィールドは最終的なものであり、変更することはできません。そのため、クライアントはセッターに直接電話する必要があります。

+0

Javadocは、仕事が最も好むアプローチです。 ;) –

+0

これはセキュリティを作成しません!他の答えを見てください。 –

+0

代替ソリューションはセキュリティを作成します。 –

0

同じクラスのアクセスについては、プライベートメンバーに直接アクセスするだけでなく、そのメンバーにアクセスする方法もあります。 基本的に、同じクラスのメンバーを直接使用することはできません。

1

リフレクションを防止する場合は、SecurityManagerを使用できます。これがオプションでない場合は、Thread.currentThread()。getStackTrace()を呼び出して呼び出しスタックを取得し、呼び出し側がクラスから来ていることを確認できます。

これには2つの問題があります。パフォーマンスは大きくはありません。あなたが外部で行うことができる方法でできることは何も、最も単純な回避策はチェックなしでその内容をコピーすることです。 ;)

このようにアクセスを許可しない理由を文書化することをお勧めします。

0

これを行う標準的な方法はありません。ユーザーがクラスインスタンスにアクセスできる場合、プライベートメンバーはプライベートと宣言されますが、実行時にアクセス権を変更してアクセスできます。

権限を強制するクラスローダーが必要です。 OSGiバンドルを作成し、インターフェイスを介してサービスとしてエクスポートされたオブジェクトのインスタンスに対して制御ポリシーを適用することができます。しかし、これはあなたのアプリケーションを実行するOSGiコンテナにつなぎます。

2

フィールドを非表示にするには、継承を使用してください:

  • はあなたが必要とするすべてのフィールドとゲッター/セッターを使ってクラスを行います。
  • プレビューから継承する子クラスを行い、フィールドにアクセスできないため、強制的にゲッター/セッターペアを使用します。
+0

それについては考えましたが、使用法は制限されています。「子クラス」は「親クラス」内の他のプライベートフィールドにアクセスできません。これはショーストッパーになる可能性があります。 –

+0

許可するアクセス権を 'protected'に変更してください!しかし、常に良いアイデアであり、ゲッター/セッター(より多くのセッター)を利用することができます。なぜなら、バリデーションやそのようなことができるからです。 –

1

フィールドがクラスの一部である限り、誰でも直接アクセスできます。これは、すべての(共同)作成者がゲッター/セッターを通過するように強制しようとすると問題になる可能性があります。なぜなら、これらのメソッドは変換、チェック、または簿記を行うからです。内部カウンターをインクリメントするのと同じです。

一般的な解決策は、注釈を使用することで可能であることに気付いています。

@GetterSetterAccessOnly 
private int value; 
0

まあ、彼らが持っている場合:あなたは、それはフィールドが、それ以外で使用されている場合、コンパイル時エラーでゲッター/セッターメソッドだと、注釈(アノテーションプロセッサ・コード)を確保するために作成する必要があるだろうあなたのコードへのアクセスは、彼らが望むことを何でもすることができます。最悪の場合、彼らはあなたのゲッターとセッターを削除し、だけではなく、公共の場に置く;)

しかし、もちろん、あなたが応じてデザインを直接変数にアクセスしないようにそれらに動機を与えることができます。

  • ますクラス自体を変更するのではなく、他の人がサブクラスを実装するべきかどうかをチェックする必要があります。プライベートフィールドはもちろん、セッターとゲッターを介してのみアクセスされます。
  • データを別のクラスに移動し、ゲッターとセッターを使用して他のクラスのデータにアクセスできます。あなたのクラスに直接データを持たないためにこれを行うのは、多分直観的ではないかもしれませんが、データにアクセスしてはならない理由があるかもしれないので、それは別の責任を示します。したがって、SRPを満たすリファクタリングは、とにかく良いアイデアです。
関連する問題