2011-07-23 8 views
2

私はクラスがパッケージ内に言ってきたcom.practise.mypackageone.MyClassクラス属性の保護または公開を宣言しますか?

クラスMyClassのは、私はこの方法では別のパッケージのクラスからのみアクセスできるようにする方法

/* Modifier */ void show() 
{ 
// some code here 
} 

を言っていますcom.practise.mypackagesecond.SecondClass

私はメソッドを公開していれば、それは私がしたくないどこでもアクセス可能になります。 もし私がそれを保護してしまえば、SecondClassはMyClassを拡張してアクセスする必要があります。

しかし、他のパッケージクラスでも、そのメソッドにアクセスするために自分のクラスを拡張することができます。

どうすればそれを防ぐことができますか?

+1

できません........................... – Javanator

+0

できませんが正しいです。 –

答えて

4

クラスを同じパッケージに入れ、メソッドパッケージをプライベート(デフォルトの修飾子)にします。そうでなければ、あなたが望むものは達成できないと思います。

+0

@peterあなたの返信ありがとうございます。私はデフォルトの修飾子を認識しています..質問は他の特定のパッケージに対してアクセス可能にしています。 例えば、私はいくつかのパッケージを含むライブラリを開発しています。そのライブラリを使用するクライアントコードは、私のライブラリパッケージが使用できるいくつかの特定のメソッドを使用することを許可すべきではありません。 –

+1

これはできません。唯一の解決策は私の答えで書いたものですが、クラスは同じパッケージになければなりません。 –

1

第一パッケージのクラスは、次のようになります第二のパッケージからクラスを拡張することができ、彼らが望むように彼らは、show()メソッドを実装することができます

public static abstract class Showable { 
     abstract protected void show(); 
    } 

一つだけのクラスが中に存在する場合このメソッドを呼び出す必要のある2番目のパッケージ(ViewManagerなど)では、このクラスだけがshow()メソッドを呼び出せるように、このShowableを埋め込むことができます。

とてもクリーンなデザインではありません。

+0

でも、これを拡張して特定のボディを提供しても。他のクラスでも最初のクラスを拡張することができ、それでもメソッドにアクセスできます。 –

+0

これを防止する他の方法があります。あなたのクラスを最終的にするか、またはコンストラクタを「パッケージプライベート」にして、それをインスタンス化するためにファクトリを使用します。 – n0rm1e

+0

classがfinal宣言されている場合、保護されていると宣言されていれば、別のパッケージクラスはそのメソッドにアクセスできません.. hmmm – Javanator

関連する問題