2012-04-12 92 views
1

由于我可以直接访问内部类的private变量,并且访问inner类的唯一方法是通过outer类。对于内部类有公共访问器/增变器方法是否有任何价值?如果只从外部类访问,是否需要内部类的公共访问器?

public class Outer { 
    Inner i; 

    Outer() { 
     i.v = 5; 
    } 

    private class Inner { 
     private int v; 
    } 
} 

对于这个问题的目的,假设没有延迟实例或其他的数据操作时访问需要。

回答

5

好吧,使字段非私有将避免创建访问这些私有成员的合成方法。在你的榜样,编译Outer$Inner类包含这样的合成方法:

static int access$002(Outer$Inner, int); 
    Code: 
     0: aload_0 
     1: iload_1 
     2: dup_x1 
     3: putfield  #1     // Field v:I 
     6: ireturn 

也许会被内联到没什么,也许不会......但除非有任何原因迫使它的存在,为什么不只是给v默认访问?

至于使用存取方法而不是直接使用字段......这更多的是品味问题。你不能阻止外部类可以直接访问字段,所以它是一个一点点就像询问你是否应该为一个类中的私有字段创建访问器一样。

正如在另一个答案中提到的那样,使用访问器使其更易于重构。是嵌套类只是一个实现细节,其中从来没有需要移动?如果是这样,也许这很好。我发现如果我有一个类似于的类只是封装字段没有其他行为,我将这些字段公开(在私人类中,不要忘记)宣传“嘿,我没有检查这里有什么......“

+0

真的吗?我认为编译器总是会创建内部类的综合方法。 – emory 2012-04-12 19:50:00

+0

重构友好是一个很好的观点!谢谢 – JAM 2012-04-12 19:50:27

+0

@emory:如果不需要任何合成材料就可以访问。至少,不是我正在运行的javac版本:) – 2012-04-12 19:50:54

1

如果稍后您可能会通过函数调用或其他方式暴露您的Inner对象,那么是的,这很重要。对于同步目的而言,这可能也很重要,具体取决于内部类中发生了什么