如何在每次调用getPersonInfo方法时重置静态布尔变量?
问题根源
validPerson和invalidPerson是静态变量,属于Person类本身而非单个实例,所有调用会共享这两个变量的状态。第一次调用后的值会被保留,后续调用不会自动恢复默认的false,这就是重新加载后布尔值异常的原因。
解决方法
方法1:每次调用方法前重置静态变量
在getPersonInfo方法开头手动重置两个静态变量的值,确保每次调用都从初始状态开始:
public class Person { private static boolean validPerson = false; private static boolean invalidPerson = false; public PersonDTO getPersonInfo(long personId) { // 每次调用前重置静态变量 validPerson = false; invalidPerson = false; PersonDTO personDto = new PersonDTO(); // 原代码的new this.PersonDTO()是语法错误,需移除this var personList = // 从API获取数据 List<AddressDTO> addressDetails = personList.stream() .map(p -> getAddressList(..传入参数..)) .collect(Collectors.toList()); personDto.setIsValidPerson(validPerson); personDto.setIsInvalidPerson(invalidPerson); personDto.setAddressDetails(addressDetails); return personDto; } private static List<String> getAddressList(String personData) { if (personData == null) { invalidPerson = true; } else { validPerson = true; // 处理personData生成addressData的逻辑 } return addressData; } }
注意:这种方式仍存在线程安全问题,多线程调用时可能出现状态混乱。
方法2:将静态变量改为实例变量
因为这两个变量的状态仅与单次getPersonInfo调用绑定,不属于类级别的共享状态,改为实例变量更合理:
public class Person { // 移除static修饰符,改为实例变量 private boolean validPerson = false; private boolean invalidPerson = false; public PersonDTO getPersonInfo(long personId) { // 每次调用前重置实例变量 validPerson = false; invalidPerson = false; PersonDTO personDto = new PersonDTO(); var personList = // 从API获取数据 List<AddressDTO> addressDetails = personList.stream() .map(p -> getAddressList(..传入参数..)) .collect(Collectors.toList()); personDto.setIsValidPerson(validPerson); personDto.setIsInvalidPerson(invalidPerson); personDto.setAddressDetails(addressDetails); return personDto; } // 同步移除static修饰符 private List<String> getAddressList(String personData) { if (personData == null) { invalidPerson = true; } else { validPerson = true; // 处理personData生成addressData的逻辑 } return addressData; } }
这种方式解决了线程安全问题,但仍需手动重置变量。
方法3:用局部变量传递状态(推荐)
通过局部变量+自定义返回值的方式,彻底避免共享状态的问题,代码更健壮且线程安全:
public class Person { public PersonDTO getPersonInfo(long personId) { PersonDTO personDto = new PersonDTO(); var personList = // 从API获取数据 boolean validPerson = false; boolean invalidPerson = false; List<AddressDTO> addressDetails = personList.stream() .map(p -> { AddressResult result = getAddressList(..传入参数..); if (result.isValid()) { validPerson = true; } else { invalidPerson = true; } return result.getAddressData(); }) .collect(Collectors.toList()); personDto.setIsValidPerson(validPerson); personDto.setIsInvalidPerson(invalidPerson); personDto.setAddressDetails(addressDetails); return personDto; } // 自定义内部类封装地址数据和验证状态 private AddressResult getAddressList(String personData) { List<String> addressData = new ArrayList<>(); boolean isValid = true; if (personData == null) { isValid = false; } else { // 处理personData生成addressData的逻辑 } return new AddressResult(addressData, isValid); } private static class AddressResult { private List<String> addressData; private boolean isValid; public AddressResult(List<String> addressData, boolean isValid) { this.addressData = addressData; this.isValid = isValid; } public List<String> getAddressData() { return addressData; } public boolean isValid() { return isValid; } } }
内容的提问来源于stack exchange,提问作者cs55
相关产品推荐
相关产品推荐

