如果以下内容正确,有人可以告诉我吗?
我想在私有方法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;
}
这会有用吗?
答案 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.dateFormat
和this.dateToValidate
的值,这意味着已经在进行的调用将(可能)开始使用第二次调用的更新值,从而导致不可预测的结果。 / p>
答案 1 :(得分:0)
每次在该类的特定实例上调用其中一个dateToValidate
或dateFormat
方法时,实例变量validateDate(....)
和validateTime(...)
都会更改。