Java枚举类结合Getter/Setter使用疑问:为何需声明私有成员变量
Java枚举类与Getter/Setter的常见误区解析
问题核心
实现Postgraduate类时,若不声明private Type type;成员变量,getter/setter会出现编译错误(红线提示);同时当前构造方法并未正确初始化类的成员变量。
原因解析
Getter/Setter的操作对象是类成员变量
Getter(getType())和Setter(setType())的作用是访问、修改类的成员变量,它们必须有明确的操作对象。如果不声明private Type type;,这两个方法找不到对应的变量,自然会报“找不到符号”的错误。
枚举只是一种数据类型,和int、String一样,需要一个成员变量来存储每个Postgraduate实例的具体枚举值,不能直接用枚举类型本身替代实例状态的存储。构造方法的局部变量遮蔽问题
你当前构造方法里的Type type=newtype;定义的是局部变量,它会遮蔽同名的类成员变量,导致构造方法根本没有初始化类的成员变量,实例化后调用getType()会返回null。
代码修正
修正后的代码解决了变量遮蔽问题,同时满足练习要求:
public class Postgraduate { private enum Type { Research, Coursework; } // 必须声明成员变量存储每个实例的Type状态 private Type type; // 使用this.type明确指向类成员变量,避免局部变量遮蔽 public Postgraduate(Type newType) { this.type = newType; } public Type getType() { return type; } public void setType(Type newType) { type = newType; } // 按照要求重写toString() @Override public String toString() { return "Postgraduate{" + "type=" + type + '}'; } }
补充说明
- 私有枚举
Type仅在Postgraduate类内部可见,符合封装原则。 - 成员变量
type用private修饰,通过getter/setter操作是Java封装特性的标准实现,避免直接修改成员变量导致的状态混乱。
内容的提问来源于stack exchange,提问作者skittlefiz
相关产品推荐
相关产品推荐

