我在Java中正确地使用getter / setter吗?

时间:2010-05-12 01:02:29

标签: java

public class Persona {
    int Codigo;
    String Nombre;

    public Persona(int Codigo, String Nombre){
        this.Codigo = Codigo;
        this.Nombre = Nombre;
    }

    public void setCodigo(int Codigo){
        this.Codigo = Codigo;
    }

    public int getCodigo(){
        return this.Codigo;
    }

    public void setNombre(String Nombre){
        this.Nombre = Nombre;
    }

    public String getNombre(){
        return this.Nombre;
    }


}

还是有一种更短(可行)的方式吗?

10 个答案:

答案 0 :(得分:11)

这取决于你所说的“做”。吸气剂和制定者比公共领域更好 - 但你真的首先需要它们吗?

  • 您是否需要公开这些信息,或者只是使用它来完成其他操作?
  • 如果你确实需要公开它,你肯定需要你的类型可以使用setter吗?不可变类型往往更容易推理,处理线程等。

只是为了“纠正”您当前的设计,假设您 想要获取getter和setter,我会将其更改为:

public final class Persona {
    private int codigo;
    private String nombre;

    public Persona(int codigo, String nombre) {
        this.codigo = codigo;
        this.nombre = nombre;
    }

    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    public int getCodigo() {
        return codigo;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getNombre() {
        return nombre;
    }
}

主要变化是字段的大写,并使字段保密。就个人而言,我也不会使用“这个”。我不需要的地方。我在()和{之间也有一个空格。这些都是个人偏好,而不是其他任何东西。

最后,我创建了课程final - 我相信“继承设计或禁止它” - 如果你需要从这个课程中派生,请考虑你想要支持什么样的专业化。

答案 1 :(得分:1)

你做得对。不幸的是,Java没有像许多其他语言那样更紧凑的方式来定义getter和setter。

要考虑的一件事 - 如果您只打算在对象构造上设置这些值,则无需使用setter。而且,如果您从未计划直接获取值,请不要定义getter。只需在需要时定义它们。

这里有一篇发人深省的文章(如果有点极端):Why getter and setter methods are evil

答案 2 :(得分:1)

这是正确的在Java中做什么(除了那些变量通常以小写开头)。你也可以使用groovy自动生成getter / setters

class Persona {
    int Codigo
    String Nombre
}

这实际上是相同的

正如其他人所提到的,如果你不需要setter,你应该避免它们并使你的变量final。不可变对象不太可能成为后来的bug来源。

答案 3 :(得分:1)

这对Java来说是正确的。请注意,由于您将两个值都传递给构造函数,因此可以删除setter,将字段标记为final,然后此类将为immutable

答案 4 :(得分:0)

对我来说,这看起来像是优秀的二传手。但是,如果将两个值都传递给构造函数,您确定需要两个setter / getter吗?在这种情况下,看起来只有吸气剂就足够了。此外,如果您决定坚持将CodigoNombre传递给构造函数,并删除setter类,则应将它们设为final,即不可变。

另一点是不要大写CodigoNombrecodigonombre是推荐的形式。方法和字段的Camel-case,仅限于类,接口和常量。

答案 5 :(得分:0)

是的,看起来确实很好。虽然您不应该将变量名称大写。

答案 6 :(得分:0)

您可能希望将成员变量Nombre和Cordigo设为“私有”。因为,这是使用getter / setter的重点。

了解你使用getter / setter的原因更为重要 一个好处是,您可以在这些方法中添加其他检查(如限制,如果它是一个数字)。此外,如果您的实施将来发生变化,它们也更容易维护。

答案 7 :(得分:0)

字段应该是私有的。原因是Encapsulation。您希望隐藏用户Persona类的任何其他类的实现详细信息。您可能有一天希望在codigo上强制执行最小值和最大值,或者确保它在固定的值集中,您可以在setCodigo()方法中执行该操作,而无需任何客户端代码了解它。只有公共领域,你无法拦截场的变异并影响它。

public final class Persona 
{
    private int codigo;
    private String nombre;

    public Persona(final int codigo, final String nombre)
    {
        this.codigo = codigo;
        this.nombre = nombre;
    }

    public void setCodigo(final int codigo)
    {
        this.codigo = codigo;
    }

    public int getCodigo()
    {
        return this.codigo;
    }

    public void setNombre(final String nombre)
    {
        this.nombre = nombre;
    }

    public String getNombre()
    {
        return this.nombre;
    }
}

我也为你修好了大括号:-) 对所有实例变量使用this.也是很好的编码实践。明确比隐含更好。

答案 8 :(得分:0)

您的变量不是private,它们是默认值。所以他们在同一个package的课堂上公开。您可能想要制作它们private。虽然几乎总是需要getter,但并不总是需要设置器。

答案 9 :(得分:0)

像Jon说的那样,你需要有充分的理由需要getter / setter。考虑一个不可变的类作为你的案例的替代。

public final class Persona {
    private final int codigo;
    private final String nombre;

    public Persona(int codigo, String nombre) {
        this.codigo = codigo;
        this.nombre = nombre;
    }

    public int getCodigo() {
        return codigo;
    }

    public String getNombre() {
        return nombre;
    }
}