吸气剂和制定者有什么意义?

Ano*_*181 74 java getter setter

可能重复:
为什么要使用getter和setter?

我已阅读的书Java,说这是好事,创建getter和setter方法的变量,如xy.例如:

public int getX(){
    return x;
}

public void setX(int x){
    this.x = x;
}
Run Code Online (Sandbox Code Playgroud)

但与此有什么不同

...(shape.x)...   // basically getX()
Run Code Online (Sandbox Code Playgroud)

shape.x = 90;    // basically setX()
Run Code Online (Sandbox Code Playgroud)

如果选手和吸气器更好,你能解释一下会出现什么样的实际问题吗?

mpr*_*hat 83

多种原因:

  • 如果你允许字段访问

    shape.x = 90

那么你将来不能添加任何逻辑来验证数据.

如果x不能小于100你就不能这样做,但是如果你有这样的安装者

public void setShapeValue(int shapeValue){
  if(shapeValue < 100){
    //do something here like throw exception.
  }
}
Run Code Online (Sandbox Code Playgroud)
  • 你不能在写逻辑上添加类似copy的东西(参见CopyOnWriteArrayList)
  • 另一个原因是为了访问课堂外的字段,您必须将它们标记为公共,受保护或默认,因此您将失去控制权.当数据非常类内部破坏封装和一般的OOPS方法.

虽然对于常数来说

public final String SOMETHING = "SOMETHING";
Run Code Online (Sandbox Code Playgroud)

你将允许字段访问,因为它们无法更改,例如变量,你将它们与getter,setter放在一起.

  • 另一种情况是当你希望你的类是不可变的时,如果你允许字段访问,那么你就会破坏你的类的不变性,因为值可以改变.但是,如果你仔细设计你的课程与吸气剂和没有制定者,你保持不变性不变.

虽然在这种情况下你必须小心getter方法,以确保你不提供对象的引用(如果你的类有对象作为实例).

我们可以使用getter和setter在任何包中使用私有变量.

  • 如果在getter/setter中出现其他一些逻辑的需要,是否应该能够将公共字段成员重构为getter/setter私有?Setter和getter似乎是字面意思"稍后编写代码行"的过早优化.从一开始就编写getter/setter的唯一原因是,如果你想让这个接口公开给你无法控制的一些代码,并且不想破坏向后兼容性. (2认同)

Jus*_*son 11

使用getter和setter函数可以实现约束和封装.可以说x是半径.shape.x = -10没有多大意义.此外,如果有人试图设置非法值,您可以打印错误,设置默认值或什么都不做.

最好将成员变量设为私有,这样它们就不能被使用它们的程序直接修改.

Mutator函数
封装


a C*_*CVn 6

很多人都提到封装了实现的细节,对我来说这是在类中使用getter和setter的最大原因.有了这个,您还可以获得许多其他好处,包括能够随心所欲地抛弃和替换实现,而无需触及使用您的类的每一段代码.在一个小项目中,这不是一个很大的好处,但如果你的代码最终成为一个使用良好的(内部或公共)库,它可以是一个巨大的好处.

一个具体的例子:数学中的复数.有些语言将它们作为语言或框架功能,而其他语言则没有.我将在这里使用一个可变类作为示​​例,但它可以很容易地变成不可变的.

一个复数可以写在表格上,a + bi包含实部和虚部,非常适合[gs]etRealPart[gs]etImaginaryPart.

但是,在某些情况下,更容易推理极坐标形式的复数re^(i?),给出[gs]etRadius(r)和[gs]etAngle(θ).

您还可以公开类似[gs]etComplexNumber(realPart, imaginaryPart)和的方法[gs]etComplexNumber(radius, angle).根据参数类型,这些可能需要也可能不需要不同的名称,但是类的消费者可以根据需要使用它们.

这两种形式是可以互换的; 您可以相当容易地从一个转换为另一个,因此类用于内部存储的形式与该类的消费者无关.但是,消费者可以使用任何一种形式 如果您选择表单a + bi作为内部表示,并使用字段而不是getter和setter公开它,不仅强制类使用者使用该表单,您以后也不能轻易改变主意并用内部表示替换re ^(iθ)因为事实证明在您的特定场景中更容易实现.你已经坚持使用你定义的公共API,它要求使用特定的字段名称来暴露实部和虚部.


Bha*_*ani 5

以下示例可以理解使用getter和setter的另一个好理由

public class TestGetterSetter{
    private String name ;


    public void setName(String name){
        this.name = name ;
    }


    public String getName(String name){
        return this.name ;
    }
}
Run Code Online (Sandbox Code Playgroud)

getter和setter的要点是只有它们才能被用来访问它们正在获取或设置的私有变量.这样您就可以提供封装,以后更容易重构或修改代码.

想象一下,您使用名称而不是其吸气剂.然后,如果你想添加类似默认的东西(如果之前没有设置默认名称是'Guest'),那么你将不得不修改getter和sayName函数.

public class TestGetterSetter{
    private String name ;


    public void setName(String name){
        this.name = name ;
    }


    public String getName(String name){
        if (this.name == null ){
            setName("Guest");
        }
        return this.name ;
    }
}
Run Code Online (Sandbox Code Playgroud)

get和set不需要getter和setter - 它们只是普通的成员函数.然而,这是一个惯例.(特别是如果你使用Java Bean)

  • Getters和setter是重构的最大诅咒!例如,尝试将50个属性的JavaBean中的30个从String更改为Date字段. (6认同)