公共或私人,Android变量真的很重要

时间:2012-09-19 18:44:16

标签: android memory private public

在单个活动中,当定义仅在该活动中使用的组件时,以下定义之间的真正区别是什么:

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

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

是否有一些“引擎盖下”的约定应该被考虑(垃圾清理,内存等),这些约定建议总是使用私有公共,如果实体本身只是在类中使用它的写在?

5 个答案:

答案 0 :(得分:26)

私人字段宣传 encapsulation

除非您需要将字段或方法公开给其他类,否则使用private是一种普遍接受的约定。从长远来看,养成这种习惯可以为你节省很多痛苦。

但是,public字段或方法没有任何内在错误。它对垃圾收集没有影响。

在某些情况下,某些类型的访问会影响性能,但它们可能比此问题的主题更先进。

一个这样的案例与访问外部类字段的内部类有关。

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 ); 
        }
    }
}

答案 1 :(得分:4)

阱, 一个重点是将变量定义为私有是java编程的标准。 因此,直接调用对象上的变量对于可能读取您的代码的其他人来说至少会显得很奇怪。

我要说的另一件事是,如果你不是单独编写一个项目编码总是一个很好的做法来限制类实现的关键属性的可见性,以避免奇怪的工作,其他开发人员可能会来用。

我个人不知道这些修饰符是否用于编译和优化目的。

总结一下,因为我认为每个有经验的java编码器我都强烈要求在属性的定义中使用这种模式。

答案 2 :(得分:2)

可见性范围与垃圾收集器或内存管理

无关

您希望尽可能减少可见性范围,以便更轻松地维护代码。

答案 3 :(得分:1)

privatepublic都是Java的关键字,其目的是面向对象设计。我建议你阅读一下这个:http://docs.oracle.com/javase/tutorial/java/concepts/

如果您只想在活动中使用这些变量(对象),那么我建议您将这些变量设为私有。

我希望这会有所帮助。

修改

我不确定使用private,public或no关键字是否会从内存角度优化您的app。据我所知,我认为它没有,你应该使用什么使你的代码最具可读性,直观性和可维护性。

答案 4 :(得分:0)

如果你的变量声明在Activity的作用域内,它通常会作为一个作用域变量。

然而,如果不是参数,则在另一种方法中使用一种方法的变量是不好的编程习惯。

示例:

为:

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; } 的范围

好:

{{1}}