对象变量vs setter和getter

时间:2018-07-03 09:56:36

标签: java object

我想问你:下面是班级学生,很简单,然后下面     主要方法。首先是我的榜样,第二是我。

public class Student{

private String name;
private int age;

public String getName(){
    return name;
}

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

public int getAge(){
    return age;
}

public void setAge(int age){
    this.age = age;
}


}

这是主要方法。我不理解为什么使它变得更加复杂。通过在示例中使用它,可以得到相同的结果。

示例1

public class Main
{
public static void main(String[] args) {

    Student johnReferenceVariable = getStudent("John",25);
    System.out.println("Name : = "+johnReferenceVariable.getName());
    System.out.println("Age  : = "+johnReferenceVariable.getAge());


}


public static Student getStudent(String name, int age){
    Student student = new Student();
    student.setName(name);
    student.setAge(age);
    return student; 
}
}

我的Main类和方法示例:

public class Main
{
public static void main(String[] args) {

    //Student johnReferenceVariable = getStudent("John",25);
    Student student = new Student();
    student.setName("Martin");
    student.setAge(25);
    System.out.println("Name : = "+student.getName());
    System.out.println("Age : = "+student.getAge());

    //System.out.println("Name : = "+johnReferenceVariable.getName());
    //System.out.println("Age  : = "+johnReferenceVariable.getAge());


}


//public static Student getStudent(String name, int age){
    //Student student = new Student();
   // student.setName(name);
    //student.setAge(age);
    //return student; 
//}
}

非常感谢

6 个答案:

答案 0 :(得分:9)

请注意,这两行不会编译:

System.out.println("Name : = "+student.getName());
System.out.println("Age : = "+student.getAge());

student不在范围内。

我想你的问题是:

  

仅编写方法主体时为什么要创建方法?

如果您采用这样的方法:

public static Student getStudent(String name, int age){
    Student student = new Student();
    student.setName(name);
    student.setAge(age);
    return student; 
}

您正在添加抽象层。不用说:

Student student = new Student();
student.setName("Tom");
student.setAge(10);

不太抽象,您说:

getStudent("Tom", 10);

更抽象。

抽象是很好的,它使您和其他程序员不必总是一直在仔细考虑正在发生的事情。当您阅读代码时,有时您不想知道(或者您已经知道)程序如何“吸引学生”。您可能只想看看您的代码在高度抽象上的作用。

在这种情况下,您的示例规模太小,无法产生效果。当编写更长的方法时,您会发现需要将其中的某些部分提取为方法。这样一来,您不必一直读取底层的代码。

答案 1 :(得分:2)

它们是等效的。

如果要使其更加面向对象,则应创建两个参数的构造函数。比您的对象声明看起来像Student student = new Student("Max", 23);

答案 2 :(得分:1)

场景1:

在第一个示例中,您仅将必需的数据传递给构造函数,这种情况就是您需要提供一些要在Object中设置的默认应用程序数据的情况。

请考虑开设银行帐户申请。在该应用程序中,您仅将必需的数据(例如名称,地址和电话)传递给构造函数。

在构造函数内部,应用程序本身向您的帐户对象提供了额外的数据,例如银行A / C编号,卡号,ATM CARD引脚等。

BankAccount(String name){
//providing AUTO GENERATED BANK A/C Number and ATM PIN
}

方案2:

在情况2中,您自己设置所有数据。因此,在创建对象时,您必须了解所有详细信息,在这种情况下,不会向您的对象提供默认或自动生成的数据。

答案 3 :(得分:0)

两者几乎相等。

唯一的区别是在示例1中,getStudent方法可以在Main的其他方法中重用。

将代码段提取为可重用的方法,可重用的类和可重用的模块有助于构建良好的软件并避免创建GOD objects

答案 4 :(得分:0)

将适当的代码提取到新方法中会使您的代码更易于阅读,并且该方法可以在以后重用,我建议您应该看一下一些Java重构示例,甚至可能是马丁·福勒的《重构》。

答案 5 :(得分:0)

使用工厂方法getStudent()是一种设计模式,可隐藏对new的调用。这样,可以将代码更改为记录,查询数据库,甚至返回学生的子类。

可以在不修改调用代码的情况下完成此操作,从而可以更好地将组件分离。

如果该方法返回一个接口而不是一个类,它将更加灵活,但是更加复杂。

所以要回答这个问题,复杂性会带来灵活性。