getter和setter方法应该有哪些名称

时间:2011-08-27 07:35:17

标签: java methods

我仍然对getter和setter方法感到困惑。我有这个代码;

public class MethodsInstances {

    public MethodsInstances(String name){
        girlName = name;
    }

    private String girlName;

    public String getName(){
        return girlName;
    }

    public void sayName(){
        System.out.printf("Your first gf was %s", getName());

    }
}

但对于“sayName”,为什么你不能使用getName(),只需输入girlName?它将是相同的,因为getName()返回girlName,如代码中所示。此外,这些方法是否必须从get和set开始,或者可以命名为任何你想要的名称?

来自新手编码员丹·B的巨大感谢

7 个答案:

答案 0 :(得分:4)

getter和setter的意思是只有它们才能被用来访问它们正在获取或设置的私有变量。通过这种方式,您可以提供封装,以后可以更轻松地重构或修改代码。

想象一下,您使用girlName代替其getter。然后,如果你想添加类似默认的东西(比如默认名称是'Guest',如果之前没有设置的话),那么你必须同时修改getter和sayName函数。

不要求getter和setter以get和set开头 - 它们只是普通的成员函数。然而,这是一个惯例。 (特别是如果你使用Java Beans

答案 1 :(得分:3)

你绝对可以在你的例子中直接使用变量,主要是因为sayName()在同一个类中。

除此之外,我认为有三个原因可以得到吸气剂和制定者:

1。)面向对象编程的原则是保持值(状态)私有,并提供与其他类交互的公共方法。

2。)具有getter和setter的类通常遵循Java bean设计模式。此模式允许在模板引擎或表达式语言(如JSP或Spring)中使用这些对象。

3.)在某些情况下,它可以防止实际错误。一个例子:

public class DateHolder() {
    public Date date;

    public static void main(String... args) {
        DateHolder holder = new DateHolder();
        holder.date = new Date();
        System.out.println("date in holder: "+holder.date);
        Date outsideDateRef = holder.date;
        outsideDateRef.setTime(1l);
        //will be different, although we did not change anything in the holder object.
        System.out.println("date in holder: "+holder.date);
    }
}

用getter和setter包装日期变量只能使用值而不是引用来操作,这会阻止这个:

public class DateHolder() {
    private Date date;
    public Date getDate() {
       return (Date)this.date.clone();
    }
    public void setDate(Date date) {
       this.date = (Date) date.clone();
    }

    public static void main(String... args) {
        DateHolder holder = new DateHolder();
        holder.setDate( new Date() );
        System.out.println("date in holder: "+holder.getDate());
        Date outsideDateRef = holder.getDate();
        outsideDateRef.setTime(1l);
        //Date in holder will not have changed
        System.out.println("date in holder: "+holder.getDate());
    }
}

答案 2 :(得分:2)

在方法中封装“获取”和“设置”变量的过程是一种常见的设计模式。如果您想要更改底层实现,这将为您提供更多自由。

举一个例子,假设你有一天想要将参数girlName更改为对象Girl而不是; 如果您直接从外部类访问girlName,则必须更改所有外部代码。

使用setter方法,您只需更改一个方法并执行

public void setGirlname(String name)
{
   girlname = new Girl(name, some_other_data);
}

或许你想确保女孩名总是以大写字母返回。

public String getGirlname()
{
    return girlName.toUpperCase();
}

从而为您的代码设计提供更多灵活性。

答案 3 :(得分:2)

你可以在这里使用girlName,你真的不必调用getName()。你需要getName()的原因是你想获得这个类之外的名字。例如,如果您创建一个新类,然后在新类中创建上述类对象并为该对象分配一个名称(girlName的值),您将无法从新类访问girlName,因为它是私有的..所以你需要一个能为你获得价值的公共方法。

此外,它不必是getName或setName,但这只是让我们很容易理解正在做什么功能。

答案 4 :(得分:2)

您必须先阅读abstractionencapsulationOOP,才能了解访问者,变更者,不变性和数据访问权。

答案 5 :(得分:1)

我们希望阻止对变量的直接访问,我们将变量设为私有变量。 当变量是私有时,其他类无法访问该变量。 如果我们将变量创建为公共变量,则所有人都可以访问它。

要更改实际的私有变量,我们现在需要public getter()或setter()。 基本命名约定表示我们将获取变量的名称,并在其前面加上get和/或set。

在您的特定情况下,getGirlname是正确的。

我们称之为封装

答案 6 :(得分:0)

这样,您可以使用Reflection在运行时检查类并调用它们。查看更多here

HTH

Ivo Stoykov