Java ATM系统技术问题:类信息访问限制与getchangebalance方法取值异常
嘿,咱们来逐个解决你碰到的这两个问题,先从代码里的方法问题说起,再聊数据访问限制的设计思路!
问题2:getchangebalance无法读取setchangebalance设置的值
先看你贴的CheckBalance.java代码:
package atm; import java.util.Scanner; public class CheckBalance extends Validation { Scanner sc = new Scanner(System.in); public CheckBalance(int i) { Validation vd = new Validation(); System.out.println("RM" + vd.getchangebalance()); System.out.println("1..."); } }
问题出在实例对象不统一:你调用setchangebalance时,操作的是某个Validation实例的accountbalance变量,但在CheckBalance的构造函数里,又新建了一个完全独立的Validation vd对象——每个类的实例都有自己的成员变量副本,所以这个新实例的accountbalance根本没被设置过,自然拿不到值。
解决方法很简单,因为CheckBalance已经继承了Validation,直接用当前实例的方法就行,不用再新建对象:
public CheckBalance(int i) { // 直接用this调用父类的get方法,当前实例继承了Validation的成员 System.out.println("RM" + this.getchangebalance()); System.out.println("1..."); }
另外要确认Validation类里的accountbalance是实例变量(非static),且setchangebalance确实给当前实例的字段赋值,比如Validation类的核心代码应该类似:
public class Validation { private int accountbalance; // 私有字段,封装数据 public void setchangebalance(int balance) { this.accountbalance = balance; // 给当前实例的字段赋值 } public int getchangebalance() { return this.accountbalance; // 返回当前实例的字段值 } }
问题1:限制用户自行从已整理信息的类中获取数据
这是典型的安全封装设计需求,核心就是不让外部代码直接触碰数据类的内部字段,甚至限制直接实例化数据类,只通过受控的方式提供数据访问:
- 第一步:私有化核心数据字段:把
Validation里的accountbalance设为private,只通过你提供的方法(或更受限的方法)操作,避免外部直接读写。 - 第二步:限制数据类的实例化权限:如果不想让其他包的类直接创建
Validation实例,可以把它的构造函数设为包私有(去掉public修饰符),或者用工厂模式控制实例创建:
// Validation类 public class Validation { private int accountbalance; // 私有构造函数,外部不能直接new private Validation() {} // 静态工厂方法,统一控制实例创建 public static Validation createInstance() { return new Validation(); } // 只提供必要的查询方法,若不需要外部修改余额,可去掉set方法 public int getchangebalance() { return accountbalance; } // 仅内部/受控类可调用的修改方法 void internalSetBalance(int balance) { this.accountbalance = balance; } }
- 第三步:用服务类封装所有数据操作:把余额查询、修改等逻辑都放到专门的
BankService类里,外部代码只能调用服务类的方法,完全接触不到底层的Validation数据类,彻底隔离数据访问:
public class BankService { private Validation validation = Validation.createInstance(); public int queryBalance() { // 可在此添加权限校验、日志记录等安全逻辑 return validation.getchangebalance(); } public void updateBalance(int newBalance) { // 加业务校验:比如余额不能为负 if (newBalance >= 0) { validation.internalSetBalance(newBalance); } else { throw new IllegalArgumentException("余额不能为负数"); } } }
这样外部代码只能通过BankService操作余额,完全无法直接从Validation类获取数据,符合银行系统的安全需求。
内容的提问来源于stack exchange,提问作者Ariff Naj
相关产品推荐
相关产品推荐

