如何在含共同isShown字段的多类对象中找到isShown为true的对象?
解决方案
方案一:定义公共接口(推荐)
这是最符合面向对象设计原则的方式,既保证类型安全,又便于后续维护。
- 定义统一接口,暴露判断是否显示的方法:
public interface Showable { boolean isShown(); }
- 让所有包含
isShown私有字段的类实现该接口,在方法中返回私有字段的值:
public class UserCard implements Showable { private Boolean isShown; // 其他自定义字段和方法 @Override public boolean isShown() { // 避免Boolean为null时触发空指针 return isShown != null && isShown; } } // 其他类如ProductPanel、SettingMenu同理实现Showable接口
- 在主程序中,将所有实例存入
List<Showable>,遍历找到目标对象:
public Showable findCurrentShownObject(List<Showable> showableInstances) { for (Showable instance : showableInstances) { if (instance.isShown()) { return instance; } } return null; // 无显示对象时返回null }
方案二:使用反射(仅应急场景)
如果无法修改现有类的代码,只能通过反射访问私有字段,但这种方式会破坏封装性,且性能较差,不推荐长期使用。
public Object findCurrentShownObject(List<Object> allInstances) { for (Object instance : allInstances) { try { // 获取私有字段isShown Field isShownField = instance.getClass().getDeclaredField("isShown"); isShownField.setAccessible(true); // 开启私有字段访问权限 Boolean isShown = (Boolean) isShownField.get(instance); if (isShown != null && isShown) { return instance; } } catch (NoSuchFieldException e) { // 当前实例没有isShown字段,直接跳过 continue; } catch (IllegalAccessException e) { // 字段访问失败,可根据需求处理异常 e.printStackTrace(); } } return null; }
注意事项
- 由于同一时刻最多只有一个对象的
isShown为true,遍历到第一个符合条件的对象即可直接返回,无需继续遍历 - 处理
Boolean类型时必须先判断是否为null,避免触发空指针异常
内容的提问来源于stack exchange,提问作者Alexander Jonsson
相关产品推荐
相关产品推荐

