2010-10-10 56 views
1

当我有一个公开的暴露类时,我通常会将其成员变量与公共访问器和增变器一起私有化(如果可能,我会尽量避免使用增变器来使我的类不可变)。我们是否应该严格遵守set/get规则

例如,

public class Point { 
    private final int x; 
    private final int y; 

    public Point(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    public int getX() { 
     return x; 
    } 

    public int getY() { 
     return y; 
    } 
} 

如果类是私人使用,我通常会

private static class Point { 
    public final int x; 
    public final int y; 

    public Point(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

因为我觉得第二个办法是我方便多了。虽然一个好的IDE可能会有所帮助,但不那么繁琐且输入少。

我想知道,如果我有一个公共消费类,我使用第二种方法是否好? (通过确保我公开的字段将是不可改变的)。

它的任何缺点?虽然它似乎违反了OOP封装理论,但从实际角度来看,我并没有看到真正的危害。

回答

5

如果它是一个私人类,只有父类将使用,我通常会放在字段而不是getter和setter。如果不会被其他第一方或第三方类使用,那么添加验证就毫无意义。

基本上,你的类需要相信自己,并且包括嵌套类。

但是,如果它是一个公共类,它将被第一或第三方使用,那么您绝对不应公开这些公共字段。如果您需要为属性添加验证,那么它将成为一个重大更改,因为您需要将公共字段更改为两个公共方法。如果你正在编写库代码,情况尤其如此。

如果您的示例中的字段为final,则可能有一个例外。如果它是一个像Point这样的小类,并且它完全是不可变,那么我可能会将这些字段公开为决赛。任何验证都会在构造函数中发生。只要确保你将来不会添加任何可能破坏该类的东西。

+0

是。我知道这对私人课程是成立的。公共课怎么样? – 2010-10-10 17:34:33

+0

@Yan Cheng CHEOK对不起,没有仔细阅读你的问题,看看编辑。 – mgbowen 2010-10-10 17:35:03

0

简单的数据持有者(又名结构在C),可以节省get/setters,恕我直言。一些像SWT或者Swing这样的现代GUI工具包都具有简单的结构化像Rectangle或者Point这样的元素直接访问的地方,以及这些类是公共API的一部分。哦,并且工具包的类没有最终的修饰符,因为通常你只能改变一个值(比如矩形中的x,把它移到右边)。

其中一个原因是,在原始值不足的情况下,点和反转通常用于返回值。

因此,我们可以得出结论:一个简单的规则,其中它的好:当且仅当该类是不可能改变的,因为它是非常简单的,如果它的使用非常普遍,这样的时间增益是衡量,如果bean绑定中没有使用属性,那么当属性更改时不需要属性更改事件,那么可以省略setter和getters。

1

通常遵循由JavaBeans约定给出的访问器规则是一个好主意,因为一些最常用的框架/库使用它来在内部访问某些字段(例如表达式语言)。

完全有必要吗?,绝对不是,这是一个约定你可以关注它或忽略它。但是尽可能多的约定,它的目标是有一个统一的方式来做一些事情(这里访问属性)。

如果您认为这样的代码需要太多时间来开发,那么您可以使用IDE(如您在问题中所述);如果问题是您必须生成的完全不必要的代码,我建议您查看Lombok Project
不幸的是,现在没有“好”的解决方案;在the premises of Java 7期间已经看到了用Java访问属性的不同方式的想法,但最终它不会成为未来版本Java语言的一部分。

随着你的公共API,我真的建议你坚持这个约定。这样,当开发人员想要使用您提供的任何组件时,他将不需要包装所有内容,以便通过getter // setter访问属性,以使其与他使用的框架一起工作。

最终属性不会改变任何问题,但此外,你不应该有最终的属性,因为你担心有人可以从外部修改它,但只是因为你的属性绝不能改变,你想它是最终的。这就是封装如此重要的原因。

+0

-1它们不是java工作方式的一部分,它们是某些框架工作方式的一部分。只要你不使用这些框架,没关系。如果您使用这些框架,则生成所需的获取者和设置者并不困难。 – 2010-10-10 17:45:32

+0

@Erick Robertson,我更新了答案,Java有点太模糊,我的意思是特别是J2EE(因此我的例子)。 – 2010-10-10 18:08:32

+0

@Colin:问题不在于J2EE。 – 2010-10-10 21:01:06