とは関係ないが、コンポーネントを定義するときにのみその活動の中で使用されるように、以下の定義間の本当の違いは何ですかエンティティ自体が書かれたクラスの内部で使用されることがある場合には、常にプライベートなものを使用することを示唆する(ガベージクリーンアップ、メモリなど) "フードの下"の規則。パブリックまたはプライベート、それは本当にAndroidの変数単一のアクティビティの内部
答えて
プライベートフィールドはそれはあなたが他のクラスのフィールドやメソッドを公開する必要がない限りprivate
を使用することが一般的に受け入れられた慣習だencapsulation
を推進しています。これを習慣にすることは、長期的にはあなたに多くの苦痛を救うでしょう。
ただし、public
フィールドまたはメソッドには本質的に間違ったものはありません。ガーベッジコレクションに違いはありません。
一部の種類のアクセスはパフォーマンスに影響しますが、おそらくこの質問のトピックよりも少し進んでいる可能性があります。
このようなケースの1つは、外部クラスフィールドにアクセスする内部クラスと関係します。
class MyOuterClass
{
private String h = "hello";
// because no access modifier is specified here
// the default level of "package" is used
String w = "world";
class MyInnerClass
{
MyInnerClass()
{
// this works and is legal but the compiler creates a hidden method,
// those $access200() methods you sometimes see in a stack trace
System.out.println(h);
// this needs no extra method to access the parent class "w" field
// because "w" is accessible from any class in the package
// this results in cleaner code and improved performance
// but opens the "w" field up to accidental modification
System.out.println(w);
}
}
}
私はこれらの隠された方法を知りませんでしたので、私はupvote –
変数宣言がアクティビティのスコープ内にある場合、通常はスコープ付き変数として正常に動作します。
ただし、パラメータでない場合は、あるメソッドの変数を別のメソッドで使用することはプログラミングの面では悪いことです。
例:
悪い:
void Foo()
{
int foo = 5;
System.out.println(Bar());
}
int Bar()
{
return foo + 5;
}
foo
が良いBar()
のためのスコープの外で宣言されているので、これは実際に構文エラーがスローされます。
int foo;
void Foo()
{
foo = 5;
System.out.println(Bar(foo)); //prints 10
}
int Bar(int foo)
{
return foo + 5;
}
なぜ「良い」は良いですか? –
@Alexあなたは不要な副作用(設計原則として)を避けたいからです。副作用は、現在のコンテキスト外の情報に影響するものとして定義されます。 – Codeman
あなたの「悪い」はコンパイルされないので、悪くない、むしろ存在しません。ですから、グッドは何にも比べていないので、なぜそれが良いのだろうと思います。 –
private
とpublic
は、オブジェクト指向設計の目的を持つJavaのキーワードの両方です。 http://docs.oracle.com/javase/tutorial/java/concepts/
アクティビティでこれらの変数(オブジェクト)のみを使用する場合は、それらの変数を非公開にすることをお勧めします。
こちらがお役に立てば幸いです。
編集:
私は、プライベート、パブリック、または全くキーワードを使用すると、視点のメモリポイントからアプリあなたを最適化するかはわかりません。限り、私はそれがないと思うと私はあなたのコードを最も読みやすく、直感的でメンテナンスできるものを使用する必要がありますと言うことができます。
ありがとう、私は彼らが何をしているのか知っている私は彼らが私のケースでは公然とする必要はありません知っているが、私は何かのブーストメモリ管理やガベージコレクションがあったかどうかは、公的または私的です。 – Octoth0rpe
視界の範囲は、ガベージコレクタやメモリ管理あなたはとてもあなたのコードは保守が容易になることができますできるだけ多くの視界の範囲を狭めることになるでしょう
とは何の関係もありません。
ありがとう、もう少し周りを掘ると、これはコンベンションのように見えます:ガベージコレクションやメモリ管理の違いはありません。 プライベートです。 – Octoth0rpe
井戸、 重要なポイントは、変数をプライベートとして定義することがJavaプログラミングの標準であることです。 オブジェクトの変数を直接呼び出すことは、コードを読んでいる可能性のある他の人には少なくとも奇妙に見えるでしょう。
他にも、プロジェクトで単独でコーディングするのではない場合、クラス実装のキーとなる属性の可視性を制限することは、他の開発者がやって来る
これらの修飾子がコンパイルや最適化の目的に使用されているかどうか私は個人的にはわかりません。
私はすべての経験豊富なJavaコーダーと思いますが、私はこのパターンを属性の定義に使用することを強く勧めています。
ほとんどの場合、とりわけ、すべてがただ1つのクラス/アクティビティにあるシナリオでは、使用する変数の範囲を制限するための適切なフォームとみなされます。 –