Java:代码理解

时间:2013-09-17 20:00:05

标签: java stackmob

我是JAVA的新手,但我知道Objective-C。我必须编写服务器端自定义代码,我在下面的代码中遇到问题:

/**
 * This example will show a user how to write a custom code method
 * with two parameters that updates the specified object in their schema
 * when given a unique ID and a `year` field on which to update.
 */

public class UpdateObject implements CustomCodeMethod {

  @Override
  public String getMethodName() {
    return "CRUD_Update";
  }

  @Override
  public List<String> getParams() {
    return Arrays.asList("car_ID","year");
  }

  @Override
  public ResponseToProcess execute(ProcessedAPIRequest request, SDKServiceProvider serviceProvider) {
    String carID = "";
    String year  = "";

    LoggerService logger = serviceProvider.getLoggerService(UpdateObject.class);
    logger.debug(request.getBody());
    Map<String, String> errMap = new HashMap<String, String>();

    /* The following try/catch block shows how to properly fetch parameters for PUT/POST operations
     * from the JSON request body
     */

    JSONParser parser = new JSONParser();
    try {
      Object obj = parser.parse(request.getBody());
      JSONObject jsonObject = (JSONObject) obj;

      // Fetch the values passed in by the user from the body of JSON
      carID = (String) jsonObject.get("car_ID");
      year = (String) jsonObject.get("year");
      //Q1:  This is assigning the values to  fields in the fetched Object?

    } catch (ParseException pe) {
      logger.error(pe.getMessage(), pe);
      return Util.badRequestResponse(errMap, pe.getMessage());
    }

    if (Util.hasNulls(year, carID)){
      return Util.badRequestResponse(errMap);
    }

    //Q2:  Is this creating a new HashMap?  If so, why is there a need?
    Map<String, SMValue> feedback = new HashMap<String, SMValue>();
    //Q3:  This is taking the key "updated year" and assigning a value (year)?  Why?
    feedback.put("updated year", new SMInt(Long.parseLong(year)));

    DataService ds = serviceProvider.getDataService();
    List<SMUpdate> update = new ArrayList<SMUpdate>();

    /* Create the changes in the form of an Update that you'd like to apply to the object
     * In this case I want to make changes to year by overriding existing values with user input
     */
    update.add(new SMSet("year", new SMInt(Long.parseLong(year))));

    SMObject result;
    try {
      // Remember that the primary key in this car schema is `car_id`

      //Q4: If the Object is updated earlier with update.add... What is the code below doing?
      result = ds.updateObject("car", new SMString(carID), update);

      //Q5: What's the need for the code below?
      feedback.put("updated object", result);

    } catch (InvalidSchemaException ise) {
      return Util.internalErrorResponse("invalid_schema", ise, errMap);  // http 500 - internal server error
    } catch (DatastoreException dse) {
      return Util.internalErrorResponse("datastore_exception", dse, errMap);  // http 500 - internal server error
    }

    return new ResponseToProcess(HttpURLConnection.HTTP_OK, feedback);
  }

}

Q1:下面的代码是将值分配给提取的对象中的字段吗?

carID = (String) jsonObject.get("car_ID");
year = (String) jsonObject.get("year");

Q2:这会创建一个新的HashMap吗?如果是这样,为什么还需要?

Map<String, SMValue> feedback = new HashMap<String, SMValue>();

问题3:这是关键&#34;更新年份&#34;并指定一个值(年)?为什么呢?

feedback.put("updated year", new SMInt(Long.parseLong(year)));

问题4:如果之前使用update.add更新了对象...下面的代码是做什么的?

result = ds.updateObject("car", new SMString(carID), update);

问题5:下面的代码是做什么的?

feedback.put("updated object", result);

Original Code

SMSet

SMInt

2 个答案:

答案 0 :(得分:3)

Q1:他们从获取的JSON对象中读取并将字段car_ID和year的值存储在两个具有相同名称的局部变量中。

Q2:是的。反馈似乎是一个将以JSON

的形式发送回客户端的地图

问题3:它将读取的值存储在新创建的hashmap'feedback'中的局部变量'year'中(如前所述)

问题4:不确定,我认为ds对象是某种数据库。如果是这样,它看起来需要将更新的值存储在hashmap'update'中并将其推送到数据库。

问题5:它将“result”对象存储在反馈hashmap中的“updated object”键下。

希望这会有所帮助:)

答案 1 :(得分:1)

<强> Q1 不,它似乎不是设置类成员变量,而是设置execute()方法的本地变量。方法返回后,GC会清除这些本地变量。嗯,不是真的,但他们现在受制于GC,但那真的很技术性。

<强> Q2 是的,您正在创建HashMap并将其引用放入MapMap是一个接口,在Java中引用这样的东西是很好的做法。这样您就不会将代码绑定到特定实现。我相信Objective-C他们被称为Prototypes ???

<强> Q3 我不确定为什么他们这样做。我假设在代码中的某处使用了feedback Map,并且该值被弹回。将地图视为NSDictionary。看起来“年”是String,因此他们使用Long.parseLong()来转换它。不确定SMInt是什么...从名称看起来像一个代表“小int”的自定义类???

<强> Q4 我不知道DataService是什么,但我必须猜测它的某些服务读/写数据???从这个方法来看,我猜它调用服务来更新刚改变的值。

<强> Q5 同样,feedbackMap ...它将result放在该地图的“更新对象”键中。