web-dev-qa-db-ja.com

パブリックまたはプライベート、それは本当に重要ですかAndroid変数

単一のアクティビティ内で、そのアクティビティ内でのみ使用されるコンポーネントを定義する場合、次の定義の実際の違いは何ですか。

Button  btnPower = null;
//or
private Button btnPower = null;
//or
public Button btnPower = null;

public void somethingUsingTheButton(){
  btnPower = (Button)findViewById(R.id.btnpower_id);
}

エンティティ自体が、それが記述されているクラス内でのみ使用される場合、常にパブリックよりもプライベートを使用することを提案する、考慮すべき「内部」の規則(ガベージクリーンアップ、メモリなど)はありますか?

26
Octoth0rpe

プライベートフィールドプロモートカプセル化

フィールドまたはメソッドを他のクラスに公開する必要がない限り、privateを使用することは一般的に受け入れられている規則です。これを習慣として取り入れることで、長期的には多くの苦痛を軽減できます。

ただし、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 ); 
        }
    }
}
28
pjco

重要な点の1つは、変数をプライベートとして定義することがJavaプログラミングの標準であるということです。したがって、オブジェクトで変数を直接呼び出すことは、コードを読む可能性のある他の人にとっては少なくとも奇妙に見えるでしょう。

もう1つ言いたいのは、プロジェクトでコーディングするのはあなただけではない場合、他の開発者が思い付く可能性のある奇妙な回避策を回避するために、クラス実装の鍵となる属性の可視性を制限することは常に良い習慣です。

これらの修飾子がコンパイルと最適化の目的に使用されているかどうかは個人的にはわかりません。

経験豊富なすべてのJavaコーダーだと思うので、結論として、属性の定義でこのパターンを使用することを強くお勧めします。

4
Mario Lenci

可視性の範囲は、ガベージコレクターやメモリ管理とは関係ありません。

コードの保守を容易にするために、可視性の範囲を可能な限り縮小する必要があります。

privatepublicは、どちらもJavaのキーワードであり、オブジェクト指向設計を目的としています。これについて読んでおくことをお勧めします: http: //docs.Oracle.com/javase/tutorial/Java/concepts/

アクティビティでこれらの変数(オブジェクト)のみを使用する場合は、これらの変数をプライベートにすることをお勧めします。

これがお役に立てば幸いです。

編集:

Private、public、またはnoキーワードを使用すると、メモリの観点からアプリが最適化されるかどうかはわかりません。私が知る限り、そうではないと思います。コードを最も読みやすく、直感的で、保守しやすいものにする必要があります。

1
Luke Taylor

変数宣言がアクティビティのスコープ内にある場合、通常はスコープ変数として機能します。

ただし、パラメータではない場合に、あるメソッドの変数を別のメソッドで使用することは、プログラミングの悪い習慣です。

例:

悪い:

_void Foo()
{
    int foo = 5;
    System.out.println(Bar());
}

int Bar()
{
    return foo + 5;
}
_

fooBar()のスコープ外で宣言されているため、これは実際には構文エラーをスローします。

良い:

_int foo;

void Foo()
{
    foo = 5;
    System.out.println(Bar(foo)); //prints 10
}

int Bar(int foo)
{
    return foo + 5;
}
_
0
Codeman