我想问你:下面是班级学生,很简单,然后下面 主要方法。首先是我的榜样,第二是我。
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;
//}
}
非常感谢
答案 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的调用。这样,可以将代码更改为记录,查询数据库,甚至返回学生的子类。
可以在不修改调用代码的情况下完成此操作,从而可以更好地将组件分离。
如果该方法返回一个接口而不是一个类,它将更加灵活,但是更加复杂。
所以要回答这个问题,复杂性会带来灵活性。