Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我们是否应该严格遵守设定/获取规则_Java - Fatal编程技术网

Java 我们是否应该严格遵守设定/获取规则

Java 我们是否应该严格遵守设定/获取规则,java,Java,当我有一个公开的类时,我通常将其成员变量设置为私有的,同时使用公共访问器和变异器,如果可能的话,我尽量避免使用变异器,以使我的类不可变 比如说, 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() {

当我有一个公开的类时,我通常将其成员变量设置为私有的,同时使用公共访问器和变异器,如果可能的话,我尽量避免使用变异器,以使我的类不可变

比如说,

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封装理论,但从实际角度来看,我并没有看到真正的危害。

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

本质上,类需要信任自己,这包括嵌套类

但是,如果它是第一方或第三方使用的公共类,则绝对不应该公开公共字段。如果需要向属性添加验证,那么它将成为一个突破性的更改,因为需要将公共字段更改为两个公共方法。如果您正在编写库代码,这一点尤其正确


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

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

本质上,类需要信任自己,这包括嵌套类

但是,如果它是第一方或第三方使用的公共类,则绝对不应该公开公共字段。如果需要向属性添加验证,那么它将成为一个突破性的更改,因为需要将公共字段更改为两个公共方法。如果您正在编写库代码,这一点尤其正确


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

简单的数据保持器,即C中的结构,可以避免get/setter,IMHO。一些现代的GUI工具包,如SWT oder Swing,都有简单的结构,如矩形或点,在这里可以直接访问元素,并且类是公共API的一部分。哦,工具箱在它们的类上没有最终的修饰符,因为通常你只改变一个值,比如矩形中的x,把它移到右边

一个原因是,在原语值不足的情况下,点和矩形通常用于返回值


因此,我们可以总结出一个简单的规则:如果且仅当类不太可能更改,因为它非常简单,并且如果经常使用它以便时间增益是可测量的,并且如果属性未在bean绑定中使用,那么在属性更改时不需要属性更改事件,然后您可能会省略setter和getter。

简单的数据保持器,即C中的结构,可以省略get/setter,IMHO。一些现代的GUI工具包,如SWT oder Swing,都有简单的结构,如矩形或点,在这里可以直接访问元素,并且类是公共API的一部分。哦,工具箱在它们的类上没有最终的修饰符,因为通常你只改变一个值,比如矩形中的x,把它移到右边

一个原因是,在原语值不足的情况下,点和矩形通常用于返回值


因此,我们可以总结出一个简单的规则:如果且仅当类不太可能更改,因为它非常简单,并且如果经常使用它以便时间增益是可测量的,并且如果属性未在bean绑定中使用,那么在属性更改时不需要属性更改事件,然后您可能会忽略setter和getter。

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

这完全必要吗?不,绝对不是,这是一个惯例,你可以遵循它,也可以忽略它。但和许多约定一样,它的目标是有一个统一的方式在这里做一些事情 属性

如果您认为这样的代码需要花费太多的时间来开发,那么您可以像您在问题中所说的那样使用IDE;如果问题是您必须生成完全不必要的代码,我建议您看看。 不幸的是,目前还没有好的解决办法;使用不同的方式访问Java中的属性的想法已经在年中出现过,但最后它不会成为Java语言未来版本的一部分

对于您的公共API,我真的建议您遵守惯例。这样,当开发人员想要使用您提供的任何组件时,他就不需要为了使用getters//setters访问属性而包装所有内容,以使其与所使用的框架协同工作


最终属性不会改变这个问题的任何内容,但更重要的是,您不应该拥有最终属性,因为您担心有人会从外部修改它,但这只是因为您的属性永远不能更改,并且您希望它是最终的。这就是封装如此重要的原因

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

这完全必要吗?不,绝对不是,这是一个惯例,你可以遵循它,也可以忽略它。但和许多约定一样,它的目标是有一种统一的方式来执行访问属性的操作

如果您认为这样的代码需要花费太多的时间来开发,那么您可以像您在问题中所说的那样使用IDE;如果问题是您必须生成完全不必要的代码,我建议您看看。 不幸的是,目前还没有好的解决办法;使用不同的方式访问Java中的属性的想法已经在年中出现过,但最后它不会成为Java语言未来版本的一部分

对于您的公共API,我真的建议您遵守惯例。这样,当开发人员想要使用您提供的任何组件时,他就不需要为了使用getters//setters访问属性而包装所有内容,以使其与所使用的框架协同工作


最终属性不会改变这个问题的任何内容,但更重要的是,您不应该拥有最终属性,因为您担心有人会从外部修改它,但这只是因为您的属性永远不能更改,并且您希望它是最终的。这就是封装如此重要的原因

是的。我知道这对私人课来说是正确的。公共课怎么样?@Yan Cheng CHEOK抱歉,没有仔细阅读您的问题,请参见编辑。是的。我知道这对私人课来说是正确的。公共类呢?@Yan Cheng CHEOK抱歉,没有仔细阅读您的问题,请参见编辑。-1它们不是java工作方式的一部分,它们是某些框架工作方式的一部分。只要不使用这些框架,就没关系。如果您曾经使用过这些框架,生成所需的getter和setter并不困难。@Erick Robertson,我更新了答案,Java有点太模糊,我指的是特定的J2EE,因此我的示例。@Colin:问题不是关于J2EE的。@Erick,是关于一个公开的类,哪个IMO应该遵循javabeans约定以与其他框架(例如JEE)兼容。即使OP以后可以很容易地添加getter/setter,作为一个公开的类,但这个类的用户可能会因为无法使用JEE开箱即用而感到烦恼。我不是说你错了看我的答案,我只是说遵循约定会更好,尤其是公开类。@Colin:J2EE不是Java约定。在编写J2EE代码时,我可以理解所有公共类都遵循JavaBean约定是很好的。根据我的理解,Java约定是任何类都不应该导出包含直接修改类属性的API。但是,如果一个类使用一个只在内部的类,我看不出有什么问题。这个类可以负责管理它,没有其他程序员需要为此烦恼。-1它们不是java工作方式的一部分,它们是一些框架工作方式的一部分。只要不使用这些框架,就没关系。如果您曾经使用过这些框架,生成所需的getter和setter并不困难。@Erick Robertson,我更新了答案,Java有点太模糊,我指的是特定的J2EE,因此我的示例。@Colin:问题不是关于J2EE的。@Erick,是关于一个公开的类,哪个IMO应该遵循javabeans约定以与其他框架(例如JEE)兼容。即使OP以后可以很容易地添加getter/setter,作为一个公开的类,但这个类的用户可能会因为无法使用JEE开箱即用而感到烦恼。我不是说你错了看我的答案,我只是说遵循惯例会更好,特别是w
第i个公开的类。@Colin:J2EE不是Java约定。在编写J2EE代码时,我可以理解所有公共类都遵循JavaBean约定是很好的。根据我的理解,Java约定是任何类都不应该导出包含直接修改类属性的API。但是,如果一个类使用一个只在内部的类,我看不出有什么问题。这个类可以负责管理这个,其他程序员不必为此烦恼。