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但是,字段或方法本身并没有任何问题。它对垃圾收集没有影响。

在某些情况下,某些类型的访问会影响性能,但它们可能比这个问题的主题更高级一些。

一种这样的情况与访问外部类字段的内部类有关。

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

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

我要说的另一件事是,如果您不是一个人在项目上编码,那么限制对类实现至关重要的属性的可见性始终是一种很好的做法,以避免其他开发人员可能想出的奇怪工作。

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

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

于 2012-09-19T19:12:16.047 回答
2

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

您将希望尽可能减少可见性范围,以便您的代码更易于维护。

于 2012-09-19T19:12:14.347 回答
1

private并且public都是具有面向对象设计目的的Java关键字。我建议你阅读一下:http ://docs.oracle.com/javase/tutorial/java/concepts/

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

我希望这有帮助。

编辑:

我不确定使用 private、public 或 no 关键字是否会从记忆的角度优化您的应用程序。据我所知,我认为它没有,您应该使用使您的代码最易读、最直观和可维护的东西。

于 2012-09-19T19:02:19.280 回答
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;
}
于 2012-09-19T18:50:35.293 回答