将公共类中声明的类成员定义的getters/setters声明为private是否有意义?

将公共类中声明的类成员定义的getters/setters声明为private是否有意义?

问题描述:

class Foo { 
    String bar; 
    // private String bar; 
} 

public class A { 
    public void method1() { 
     Foo foo = new Foo(); 
     // foo.bar; or foo.getBar(); which is preferable 

    } 
} 

是否有意义声明变量为私有与类成员定义getter/setter方法(例如应bar被声明为private在Foo或是否应该只是声明为String bar)?我宁愿删除它们,意识到无论如何都不能在这门课之外访问它们。什么是更可取的?将公共类中声明的类成员定义的getters/setters声明为private是否有意义?

+2

你的问题不清楚。无论如何,Foo现在不是内心阶层。请给出一个简短但完整的例子,包括您想要删除的获得者/设置者。 – 2011-06-04 05:39:52

+0

@Jon - 将删除内部类标记,这是针对在类“A”中声明的类 – Joe 2011-06-04 05:42:39

+0

@Joe:更改示例会比更改标记更好...您的问题仍不清楚。 – 2011-06-04 05:44:31

使用获取器和设置访问/变异私人字段成员是标准的OO练习。它允许在保持公共接口的同时改变类的内部工作。

如果您通过使其作为公共接口的一部分直接可用(通过公开)访问/更改bar,现在看起来似乎很好,但是几个月后,您决定要添加一些验证到bar?也许你不希望bar永远被设置为null。你怎么能做到这一点?如果您使用getter和setter,则只需要尝试将bar设置为null,您就需要更改设置器以引发异常。如果您直接改变bar,则不能这样做。更彻底地,你可能会决定不再需要bar

获取者和设置者并不意味着该类内部存在相同名称和类型的字段成员。他们只告诉你,这个类有一个可以被访问/变异的属性,并且不会指示类在内部执行的方式。这给你一个很大的灵活性。

如果只是数据访问,没有getter/setter应该没问题(一些纯粹主义者可能不同意)。而且你的班级应该可以访问内部班级的私人成员,这样你就可以保持私密。

请先回答:为什么method1需要知道foobar?为什么method1需要知道Foo s甚至bar s在第一位?

+0

为什么不知道foo的酒吧?我有一些需要在Foo中使用bar成员变量的功能。我不知道为什么这里有关。我需要澄清我是否应该使用getter访问bar,还是应该避免getter并通过foo.bar访问它? – Joe 2011-06-04 06:58:03

+0

因为不了解对象的成员是OOP中的默认**。这是相关的,因为你显然正在尝试编写OO代码,并且有一些方法可以做到这些。在Foo中需要使用bar成员变量的功能“通常是**应该由Foo本身**提供的功能。 – 2011-06-06 22:39:37

让富的内部类并没有getter/setter方法:

public class A { 
    private class Foo { 
     String bar; 
    } 

    public void method1() { 
     Foo foo = new Foo(); 
     foo.bar = "x"; 
    } 
} 

这是OK的设计,因为foo是唯一可见内的 - 它没有比在一个类中直接访问私有字段更糟而不是通过吸气剂。