打字猴:1.700439406e+09
1700439406
1700439407 System.out.println(sb);
1700439408
1700439409 }
1700439410
1700439411 }
1700439412
1700439413 打印出的结果很简单:
1700439414
1700439415 姓名:张三 基本工资:1000 绩效工资:2500。
1700439416
1700439417 但是这不符合需求,因为计税系统只能从HR系统中获得人员姓名和基本工资,而绩效工资是不能获得的,这是个保密数据,不允许发生泄露。怎么解决这个问题呢?你可能马上会想到四种方案:
1700439418
1700439419 (1)在bonus前加上transient关键字
1700439420
1700439421 这是一个方法,但不是一个好方法,加上transient关键字就标志着Salary类失去了分布式部署的功能,它可是HR系统最核心的类了,一旦遭遇性能瓶颈,想再实现分布式部署就不可能了,此方案否定。
1700439422
1700439423 (2)新增业务对象
1700439424
1700439425 增加一个Person4Tax类,完全为计税系统服务,就是说它只有两个属性:姓名和基本工资。符合开闭原则,而且对原系统也没有侵入性,只是增加了工作量而已。这是个方法,但不是最优方法。
1700439426
1700439427 (3)请求端过滤
1700439428
1700439429 在计税系统获得Person对象后,过滤掉Salary的bonus属性,方案可行但不合规矩,因为HR系统中的Salary类安全性竟然让外系统(计税系统)来承担,设计严重失职。
1700439430
1700439431 (4)变更传输契约
1700439432
1700439433 例如改用XML传输,或者重建一个Web Service服务。可以做,但成本太高。
1700439434
1700439435 可能有读者会说了,你都在说别人的方案不好,你提供个优秀的方案看看!好的,这就展示一个优秀的方案。其中,实现了Serializable接口的类可以实现两个私有方法:writeObject和readObject,以影响和控制序列化和反序列化的过程。我们把Person类稍做修改,看看如何控制序列化和反序列化,代码如下:
1700439436
1700439437 public class Person implements Serializable{
1700439438
1700439439 private static final long serialVersionUID=60407L;
1700439440
1700439441 //姓名
1700439442
1700439443 private String name;
1700439444
1700439445 //薪水
1700439446
1700439447 private transient Salary salary;
1700439448
1700439449 public Person(String_name, Salary_salary){
1700439450
1700439451 name=_name;
1700439452
1700439453 salary=_salary;
1700439454
1700439455 }
[ 上一页 ]  [ :1.700439406e+09 ]  [ 下一页 ]