对象变量与二传手和getter



我想问你:下面是班级学生,很容易,然后下面 主要方法。首先是我的例子。

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; 
}
}

我的主类和方法示例:

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; 
//}
}

非常感谢

请注意,这两行不编译:

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);

哪个更抽象。

抽象是好的,它允许你和其他程序员不必一直详细考虑正在发生的事情。当你阅读代码时,有时你不想知道(或者你已经知道(你的程序是如何"吸引学生"的。您可能只想在高抽象级别上查看代码的作用。

在这种情况下,您的示例规模太小,无法产生影响。当你编写更长的方法时,你会发现需要提取它的某些部分作为方法。这样,您就不必一直阅读低级抽象的代码。

它们是等效的。

如果你想让它更加面向对象,你应该创建一个双参数构造函数。比你的对象声明看起来像Student student = new Student("Max", 23);.

场景 1:

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

考虑银行开户申请。在该应用程序中,您只需将所需的数据(如姓名、地址和电话(传递到构造函数中。

在构造函数内部,应用程序本身为您的帐户对象提供额外的数据,如银行A/C号,卡号,ATM卡密码等。

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

场景 2:

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

将正确的代码提取到新方法中会使您的代码更易于阅读,并且该方法可以在以后重用,我建议您应该看看一些Java重构示例,也许还有Martin Fowler的重构书。

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

这可以在不修改调用代码的情况下完成,从而更好地解耦组件。

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

因此,要回答这个问题,复杂性创造了灵活性。

两者几乎是等价的。

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

将代码片段提取到可重用的方法、可重用的类和可重用的模块中有助于构建良好的软件并避免创建 GOD 对象。

最新更新