更新具有相同名称的变量值

时间:2015-09-01 16:19:42

标签: java

如果以下内容正确,有人可以告诉我吗?

我想在私有方法isThisValid()中使用相同的变量来执行两个不同的任务。下面会更新我需要的值吗?

public boolean validateDate(String dateForValidation, String format) {
    this.dateFormat = format;
    this.dateToValidate = dateForValidation;
    isThisValid();
    if(isThisValid() == true)
    {
    return true;
    }
    else{
        throw new IllegalArgumentException(
                dateToValidate + "did not match expected" + dateFormat);
    }
}
public boolean validateTime(String TimeToValidate, String TimeFormat){
    this.dateFormat = TimeFormat;
    this.dateToValidate = TimeToValidate;
    isThisValid();
    if(isThisValid() == true)
    {
    return true;
    }
    else{
        throw new IllegalArgumentException(
                dateToValidate + "did not match expected" + dateFormat);
    }
}

private boolean isThisValid(){
    if (dateToValidate == null) {
        logger.info(dateToValidate + "was equal to null");
        return false;
    }
    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
    sdf.setLenient(false);

    try {
        // if not valid, it will throw ParseException
        Date date = sdf.parse(dateToValidate);
        System.out.println(date);

    } catch (ParseException e) {
        logger.info(dateToValidate + "did not match expected" + dateFormat + "throw ParseException");
        logger.trace(
                dateToValidate + "did not match expected" + dateFormat + "so it was not valid, so throw ParseException");
        e.printStackTrace();
        return false;
    }

    return true;
}

这会有用吗?

2 个答案:

答案 0 :(得分:1)

  

这会有用吗?

也许,在某些情况下。这实际上取决于你想要做什么,这在你的问题中并不清楚。

如果它被多个线程调用,它将会做非常奇怪和不可预测的事情。

您通常不希望使用这样的可变状态:相反,将isValid中需要的内容传递到isValid

public boolean validateTime(String timeForValidation, String format) {
    if(isThisValid(timeForValidation, format) == true) {
      return true;
    }
    throw new IllegalArgumentException(...);
}

public boolean validateDate(String dateForValidation, String format) {
    if(isThisValid(dateForValidation, format) == true) {
      return true;
    }
    throw new IllegalArgumentException(...);
}

private boolean isThisValid(String timeToFormat, String timeFormat){
  // ...
}

它在多线程环境中不起作用的原因是validateTime(或validateDate)的一次调用未必在下一次调用发生之前完成。下一次调用将踩踏this.dateFormatthis.dateToValidate的值,这意味着已经在进行的调用将(可能)开始使用第二次调用的更新值,从而导致不可预测的结果。 / p>

答案 1 :(得分:0)

每次在该类的特定实例上调用其中一个dateToValidatedateFormat方法时,实例变量validateDate(....)validateTime(...)都会更改。