我应该将此方法设为静态吗?

时间:2015-05-13 07:37:12

标签: java android

我正在编写一个Android应用程序来解析有关停车场的xml提要。 我创建了一个单独的类,它接收一个xml feed作为字符串,然后该类将解析该字符串,为feed中的每个停车场创建对象。每次刷新xml feed并且需要解析它时我会使用它,我是否应该使这个类静态。我仍然不能100%确定什么时候制作静态的东西。

我的代码:

public class XMLParser2 {

private static CarPark carPark;
private static ArrayList<CarPark> carParkListings;

// Parse XML string and save each car park object created within an Arraylist collection
public static ArrayList<CarPark> parseXML(String xml) throws XmlPullParserException, IOException {

    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
    factory.setNamespaceAware(true);
    XmlPullParser xpp = factory.newPullParser();
    xpp.setInput(new StringReader(xml));
    int eventType = xpp.getEventType();
    carParkListings = new ArrayList<CarPark>();

    while (eventType != XmlPullParser.END_DOCUMENT) {

        if (eventType == XmlPullParser.START_TAG) {
            if (xpp.getName().equalsIgnoreCase("situation")) {
                // Create new CarPark object to hold car park data
                carPark = new CarPark();
            }
            // Check start tag for each element wanting to obtain and save in the 
            // carPark object using its associated set method
            if (xpp.getName().equalsIgnoreCase("carparkstatus")) {
                String status = xpp.nextText();
                if (status.matches("enoughSpacesAvailable"))
                    carPark.setCarParkActive("Open");
                else if (status.matches("carParkClosed"))
                    carPark.setCarParkActive("Closed");
                else
                    carPark.setCarParkActive("Full");
            }
            if (xpp.getName().equalsIgnoreCase("overallstarttime")) {
                carPark.setDateCreated(xpp.nextText());
            }
            if (xpp.getName().equalsIgnoreCase("latitude")) {
                Double latitude = Double.parseDouble(xpp.nextText());
                carPark.setLatitude(latitude);
            }
            if (xpp.getName().equalsIgnoreCase("longitude")) {
                Double longitude = Double.parseDouble(xpp.nextText());
                carPark.setLongtitude(longitude);
            }
            if (xpp.getName().equalsIgnoreCase("carparkidentity")) {
                String[] identity = xpp.nextText().split("\\:");
                carPark.setCarParkName(identity[0]);
                carPark.setCarParkID(identity[1]);
            }
            if (xpp.getName().equalsIgnoreCase("occupiedspaces")) {
                int occupiedSpaces = Integer.parseInt(xpp.nextText());
                carPark.setOccupiedSpaces(occupiedSpaces);
            }
            if (xpp.getName().equalsIgnoreCase("totalcapacity")) {
                int totalCapacity = Integer.parseInt(xpp.nextText());
                carPark.setTotalSpaces(totalCapacity);
            }
        }
        // Check if the tag is an end tag
        else if (eventType == XmlPullParser.END_TAG) {
            if (xpp.getName().equalsIgnoreCase("situation")) {
                // Calculate total spaces free
                carPark.setFreeSpaces();
                // Add CarPark class object to carParkListings ArrayList collection
                carParkListings.add(carPark);
            }
        }
        // Move to next event
        eventType = xpp.next();
    }
    // Return ArrayList collection
    return carParkListings;
}

}

3 个答案:

答案 0 :(得分:2)

最好让它不是静态的。您可以操作类中的对象,如果多个类在同一时间调用相同的方法,则可能会遇到问题。例如,一个类调用此方法并开始执行,同时另一个类调用该方法并在第一个完成之前到达行carPark = new CarPark();。它会影响结果。

更好地使用实例并使字段carParkcarParkListings非静态。

答案 1 :(得分:1)

如果您在调用parseXML方法时不想创建XMLParser2类的任何实例,则可以将其设置为静态。

但你不应该做的是在你的parseXML方法中使用全局静态属性。

private static CarPark carPark;
private static ArrayList<CarPark> carParkListings;

这两个变量只需要在方法内定义局部。

答案 2 :(得分:1)

如果你没有在XMLParser2中维护任何其他状态,我认为它是静态方法的一个很好的候选者,因为它对我来说看起来像一个实用工具方法,但是你应该为方法本身制作carPark和carParkListings局部变量。如果它不使用任何实例变量,则应该使用静态方法。您只需要将输入指定为方法的参数,并期望获得某些结果。