因此,我正在为夏季项目制作飞机预订系统以保持Java的新鲜感。对于任何预订系统,它需要很多类和方法。目前我正在努力进口船队。
我的主要方法就像我的程序的时间顺序指南。
public static void main(String[] args){
//start here
//accept passenger credentials
//place passenger in seat on plane
}
我的问题是格式化问题。当我想开始为我的舰队“制造”我的飞机时。它有点像这样。
//...
Airplane Boeing737 = new Airplane(seats[], nameOfAircraft);
这将放置构建我的飞机所需的所有值,显然飞机构造函数有更多变量。
我的想法是在Airplane课程中为我做一个方法。但为了做到这一点,我需要为另一个类(使用我的main方法的那个)调用一个空白构造函数来查看它。由于某种原因,我觉得这是一种可怕的形式。有一个更好的方法吗?
我发布的另一个想法是修改构造函数,使其不接受任何参数,并在那里做所有事情。我觉得这就是我应该做的事情,但我不是百分百肯定这将是正确的选择。我想我的整体问题是在这种情况下最佳做法是什么。
答案 0 :(得分:4)
使用构建器模式,这将允许您:
Joshua Bloch在Effective Java第1章第2项中指出:
幸运的是,第三种替代方案结合了伸缩式的安全性 具有JavaBeans模式可读性的构造函数模式。它是一种形式 生成器模式。而不是直接制作所需的对象, 客户端使用所有必需参数调用构造函数(或静态工厂)并获取构建器对象。
修改他的例子:
//Builder Pattern
public class Airplane {
private final int[] seats;
private final String name;
private final int maxSpeed;
private final int maxPassengers;
public static class Builder {
// Required parameters
private final int[] seats;
private final String name;
// Optional parameters - initialized to default values
private int maxSpeed = 1000;
private int maxPassengers = 150;
public Builder(int[] seats, String name) {
this.seats = seats;
this.name = name;
}
public Builder maxSpeed(int val) {
maxSpeed = val;
return this;
}
public Builder maxPassengers(int val) {
maxPassengers = val;
return this;
}
public Airplane build() {
return new Airplane(this);
}
}
private Airplane(Builder builder) {
seats = builder.seats;
name = builder.name;
maxSpeed = builder.maxSpeed;
maxPassengers = builder.maxPassengers;
}
}
然后你可以创建几种不同的飞机
public static void main(String[] args) {
// only mandatory params
Airplane boeing747 = new Airplane.Builder(new int[] {1,0,1}, "boeing747").build();
// just one param
Airplane boeing646 = new Airplane.Builder(new int[] {1,1,1}, "boeing646").maxPassengers(250).build();
// all params
Airplane fighter = new Airplane.Builder(new int[] {1,0,0}, "fighter_1").maxPassengers(3).maxSpeed(1600).build();
}
答案 1 :(得分:2)
暂时忘掉主要方法,你不知道它是否是一个命令行程序,带有UI,web服务的桌面应用程序或者是什么。您不知道它是独立的还是托管在某个框架或应用程序服务器中。
我建议从单元测试开始,用TDD驱动域模型/业务逻辑的设计。
你不想看到像Boeing737这样硬编码的东西。它将从其他来源获得其输入,例如输入,xml文件,现有数据库,其他一些系统。
然后,您将动态创建Airplane实例。您将从UI或DB或XML解析器传递类似DTO的东西到构造函数。还有其他方法,例如查找工厂模式,但他们往往会过度使用恕我直言。
你似乎是以一种与现实世界中任何人都无法匹敌的方式开始的。很难给出更好的建议。