我正在编写一个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;
}
}
答案 0 :(得分:2)
最好让它不是静态的。您可以操作类中的对象,如果多个类在同一时间调用相同的方法,则可能会遇到问题。例如,一个类调用此方法并开始执行,同时另一个类调用该方法并在第一个完成之前到达行carPark = new CarPark();
。它会影响结果。
更好地使用实例并使字段carPark
和carParkListings
非静态。
答案 1 :(得分:1)
如果您在调用parseXML方法时不想创建XMLParser2类的任何实例,则可以将其设置为静态。
但你不应该做的是在你的parseXML方法中使用全局静态属性。
private static CarPark carPark;
private static ArrayList<CarPark> carParkListings;
这两个变量只需要在方法内定义局部。
答案 2 :(得分:1)
如果你没有在XMLParser2中维护任何其他状态,我认为它是静态方法的一个很好的候选者,因为它对我来说看起来像一个实用工具方法,但是你应该为方法本身制作carPark和carParkListings局部变量。如果它不使用任何实例变量,则应该使用静态方法。您只需要将输入指定为方法的参数,并期望获得某些结果。