Java面向对象编程:Setter与Getter接口及实现类疑问求助
Hey Richard, 你能想到用接口来定义类的行为契约,这已经是面向对象设计里非常棒的起步了!从你给出的代码片段来看,我猜你可能在封装规范和接口实现的细节上还有些模糊,我来帮你拆解下问题,顺便给出优化建议:
首先,修正实现类的封装问题
你当前的Pitch类里,occuranceTime和pitch是默认的包级访问权限,这不符合面向对象的封装原则——外部代码可以直接修改这些变量,很容易导致数据不一致或者后续维护困难。正确的做法是把成员变量设为private,完全通过接口定义的get/set方法来访问:
public class Pitch implements PitchInterface { // 设为private,确保只有类内部能直接操作 private float occuranceTime; private float pitch; // 实现接口的所有方法,添加@Override注解能避免方法签名错误(推荐) @Override public void setOccuranceTime(float occuranceTime) { this.occuranceTime = occuranceTime; // 这里还可以加校验逻辑,比如: // if (occuranceTime < 0) throw new IllegalArgumentException("时间不能为负数"); } @Override public float getOccuranceTime() { return occuranceTime; } @Override public void setPitch(float pitch) { this.pitch = pitch; // 同理,限制pitch的取值范围 // if (pitch < 0 || pitch > 20000) throw new IllegalArgumentException("音高超出合理范围"); } @Override public float getPitch() { return pitch; } // 可选:添加构造方法,方便直接初始化对象 public Pitch(float occuranceTime, float pitch) { this.setOccuranceTime(occuranceTime); this.setPitch(pitch); } // 无参构造方法,满足框架反射创建对象的需求(如果需要的话) public Pitch() {} }
然后,聊聊接口的命名与设计
Java的命名惯例里,接口通常不需要加Interface后缀,比如你这个接口可以直接命名为Pitch,然后实现类叫BasicPitch或者PitchImpl,这样代码更简洁易读。如果你的业务场景里有多个不同类型的Pitch实现,这种命名方式会更清晰:
// 调整后的接口名,去掉冗余的Interface后缀 public interface Pitch { void setOccuranceTime(float occuranceTime); float getOccuranceTime(); void setPitch(float pitch); float getPitch(); } // 实现类改名,明确这是基础实现 public class BasicPitch implements Pitch { // 内部实现和上面一致 }
最后,解答你可能的核心困惑
- 为什么要先定义接口?:接口是一种行为契约,它规定了实现类必须具备的能力,但不关心具体怎么实现。比如后续你需要一个支持动态调整音高的类
AdjustablePitch,只要实现Pitch接口,外部代码就能用统一的Pitch类型来引用它,不用修改原有逻辑,这就是面向接口编程的好处——提高扩展性和可维护性。 - 封装到底有什么用?:把变量藏在类内部,只通过方法暴露访问入口,你可以在方法里添加校验、日志、转换等逻辑,后续哪怕你把
float改成double或者用其他存储方式,外部调用代码完全不需要修改,降低了代码耦合度。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

