28

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

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

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

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

4

5 に答える 5

30

プライベートフィールドはカプセル化を促進します

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 ); 
        }
    }
}
于 2012-09-19T19:11:57.883 に答える
4

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

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

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

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

于 2012-09-19T19:12:16.047 に答える
2

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

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

于 2012-09-19T19:12:14.347 に答える
1

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

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

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

編集:

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

于 2012-09-19T19:02:19.280 に答える
0

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

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

例:

悪い:

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;
}
于 2012-09-19T18:50:35.293 に答える