如何从类中获取数据而不是将其设为静态

时间:2016-10-30 16:05:47

标签: java static-methods

例如,我有这个类输出我在java doc" Flight.java"中的详细航班输出。 :

public String toDetailedString() {
    String output =
        getDeparture() + " - " + getArrival() + "\n" + Airport.getAirportCity(source) + " (" +
        source + ") - " + Airport.getAirportCity(destination) + " (" + destination + ")" +
        "\n" + plane.getAirline() + " " + number + " * " + plane.getModel();
    return output;

}

我有一个行程班" Itinerary.java"我想从Flight.java中提取信息而不使toDetailedString为静态,这可能吗? 有关添加的信息,您看到的每个变量"来源,编号,目的地" Flight.java中的所有私有变量,我知道它是封闭的封装。任何帮助都非常有价值。

Itinerary.java中的示例实现

public String toString() {
    return "The total cost is" + getTotalCost() + Flight.toDetailedString();
}

更新:

在我的Flight构造函数中,我有:

public Flight(Plane plane, String number, double cost, Time departure, int duration, Airport source, Airport destination) {
    this.plane = plane;
    this.number = number;
    this.cost = cost;
    this.departure = departure;
    this.duration = duration;
    this.source = source;
    this.destination = destination;
}

我在其中创建了对象" f1"在我的ItineraryTest课程中:

Flight f1 = new Flight(new Plane(Airline.American, "Airbus A321"),
        "495",
        79,
        new Time(7, 10), 100,
        Airport.PHX, Airport.LAX);

因此我将我的对象链接到toDetailedString()对象" f1"被重命名为" first"在我的Itinerary.java中创建了另一个名为" f2"并转移到"第二" (为避免混淆):

public String toString() {
    return "The total cost: " 
            + getTotalCost()
            + " "
            + first.toDetailedString()
            + second.toDetailedString();
}

我以为我回答了自己的问题,但现在收到错误:

  

线程中的异常" main" java.lang.NullPointerException at   Itinerary.toString(Itinerary.java:117)at   java.lang.String.valueOf(String.java:2994)at   java.io.PrintStream.println(PrintStream.java:821)at   ItineraryTest.main(ItineraryTest.java:20)

2 个答案:

答案 0 :(得分:0)

可能的,clean选项是创建另一个名为FlightToDetailedString的类,其中包含(可能是静态的)方法toDetailedString。该方法将接受Flight的实例作为参数

class FlightToDetailedString {
  public String toDetailedString(Flight flight) {
    String output =
        getDeparture() + " - " + getArrival() + "\n" + Airport.getAirportCity(source) + " (" +
        source + ") - " + Airport.getAirportCity(destination) + " (" + destination + ")" +
        "\n" + plane.getAirline() + " " + number + " * " + plane.getModel();
    return output;    
}
}

在我的示例中,方法不是静态的。对于非静态成员,FlightToDetailedString可以拥有(toDetailedString} FlightToDetailedString类的FlightToDetailedString字段。例如,Airport可能是toDetailedString的成员变量。你确定要把自己限制在一个机场吗?

为什么你不喜欢Flight作为{{1}}类的非静态成员?在示例中,您给出它是最自然的解决方案。如果您的行程需要访问Flight类的详细信息,只需将Flight对象的实例作为参数传递!

答案 1 :(得分:0)

toDetailedString()的消费者无需访问Flight内的任何内容。

NullPointerException可能是由Flight实例中的某个字段null引起的。

最后,考虑使用StringBuilder而不是连接字符串。