解析java数据过滤的思想
1 含义
把不符合条件的数据过滤掉,只允许符合条件的数据被赋值。就类似于高考分数线,一本分数线会过滤掉上不了一本的学生。
2 为什么要用
因为封装的其中一个作用是保证输入数据的合理性,而保证输入的数据合理就应该用到今天我给大伙分享的数据过滤思想
3 如何用?
3.1 限制修改的次数
3.1.1 典型例题
存在一个Student类,新建一个Student对象,需要实例化对象的时候给属性sex赋值,但是该属性只允许设置一次,当你第二次设置时,会在控制台打印"性别经过初始化后就不能修改"的信息
3.1.2 示例代码
Student
package Work;
public class Student {
private String name;
//姓名
private String sex;
//年龄
private boolean flag=true;
//判断性别属性是否是第一次修改,第一次修改完成后会把其值改为false
public Student() {
}
public Student(String name, String sex) {
this.name = name;
setSex(sex);
//调用本类中的setSex方法,保证性别只允许被初始化一次
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
if(flag){
this.sex = sex;
flag=false;
//设置完第一次后,就不能再去对其更改了,因而flag改为false
}else{
System.out.println(name+"的性别已经被初始化一次了,不允许再次修改了!!!!!!");
}
}
}
TestStudent
package Work;
public class TestStudent {
public static void main(String[] args) {
Student student=new Student("张三","男");
System.out.println("再次修改性别前,"+student.getName()+"同学的性别为: "+ student.getSex());
student.setSex("女");
System.out.println("再次修改性别后,"+student.getName()+"同学的性别为: "+ student.getSex());
}
}
3.1.3 示例代码运行截图
3.1.4 思路总结
a 若只能修改的次数是一次
a.1 定义一个boolean类型的变量flag,默认为true
a.2 赋值前需要进行if条件判断,若flag为true,则条件成立,执行里面的赋值语句,并把flag设置为false,
a.3 非首次(第一次)去调用方法的时候,flag为false了,条件不成立,因此不会执行里面的赋值语句
b 若只能修改的次数不是一次,假设为n次
b.1 可以设置一个count变量(初始为0),
b.2 把++count<=n作为if判断的条件
若count的值小于等于n,那么条件成立,会执行里面的赋值语句
若count值大于n,那么条件不成立,就不会执行里面赋值语句
3.2 不符合条件放前面,符合条件的内容放后面
3.2.1 典型例题
存在一个Student类,新建一个Student对象,需要实例化对象的时候给属性age赋值,只允许输入的age在10-20之间,当你输入不符合条件的年龄,会在控制台输出"设置年龄不成功,年龄应在10岁到20岁之间"然后其里面的age属性还是默认值0
3.2.2 示例代码
Student
package Work;
public class Student {
private String name;
//姓名
private int age;
//年龄,范围为: [15,20]
public Student() {
}
public Student(String name,int age) {
this.name = name;
setAge(age);
//调用本类中的setAge方法,保证通过构造方法初始化年龄的时候也是符合要求的
//如果输入有误,那年龄默认就是0
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age<15||age>20){
System.out.println("设置年龄不成功,年龄应在10岁到20岁之间");
return;
//return;的作用是直接结束方法,这个用法只可以在返回值类型为void的方法里面使用
}
this.age = age;
}
}
TestStudent
package Work;
public class TestStudent {
public static void main(String[] args) {
Student student=new Student("张三",8);
System.out.println("设置不符合条件的年龄时: "+student.getName()+"同学的年龄为: "+ student.getAge());
student.setAge(18);
System.out.println("正确修改年龄后,"+student.getName()+"同学的年龄为: "+ student.getAge());
}
}
3.2.3 示例代码运行截图
3.2.4 思路总结
a.把不符合条件的数据先在前面用单if过滤掉。若进入if条件后,会打印数据不合法并通过return;结束方法
b.当if条件不成立时,意味着数据合法,可以进行后面的赋值操作了
3.3 特殊场景的公式放前面,通用公式放后面
3.3.1 典型例题
存在一个Person类,存在属性salary(薪水)、 workingHours(工作小时数)、hourlyWage(时薪),薪水的计算规则为: 工作小时数*时薪,但超过160小时的薪水会按照1.5倍数去进行计算,先需要你建立两个Person对象,分别测试没超过160小时的薪水和超过160小时的薪水.
3.3.2 示例代码
Person
package Work;
public class Person {
private String name;
//年龄
private double salary;
//月薪,计算规则为工作小时*时薪,其中超过160小时,会有1.5倍的薪水
private int workingHours;
//工作小时数
private double hourlyWage;
//时薪
public Person() {
}
//薪水是需要调用方法算出来的,因此不用在实例化对象的时候传递salary这个参数
public Person(String name, int workingHours, double hourlyWage) {
this.name = name;
this.workingHours = workingHours;
this.hourlyWage = hourlyWage;
setSalary(workingHours,hourlyWage);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
//计算薪水
public void setSalary(int workingHours,double hourlyWage) {
//只有超过160小时的工资部分才会有1.5倍薪水
//超过160小时的那部分工资要多加0.5倍薪水,多加的放前面
if(workingHours>160){
this.salary+=(workingHours-160)*hourlyWage*0.5;
}
this.salary+=workingHours*hourlyWage;
}
public int getWorkingHours() {
return workingHours;
}
public void setWorkingHours(int workingHours) {
this.workingHours = workingHours;
}
public double getHourlyWage() {
return hourlyWage;
}
public void setHourlyWage(double hourlyWage) {
this.hourlyWage = hourlyWage;
}
@Override
public String toString() {
return "名字为: "+name+",工作时长为: "+workingHours+",时薪为: "+hourlyWage+"的员工的薪水为: "+salary;
}
}
TestPerson
package Work;
public class TestPerson {
public static void main(String[] args) {
Person p1=new Person("张三",100,15);
System.out.println(p1.toString());
Person p2=new Person("李四",180,15);
System.out.println(p2.toString());
}
}
3.3.3 示例代码运行截图
3.3.4 思路总结
a.找到公式里面的通用性(无论什么情况都可以这么运算)与特殊性(特定条件才能成立)
b.把特殊性放在前面用单if进行判断
c.把通用性放在单if结构的下面
3.4 一个公式搞定两种情况
3.4.1 典型例题
随机生成一个两位数,两位数需要满足的条件如下所示
a 首位不为0
b 首位可以是1-9之间的任意一个数字
c 个位可以是0-9之间的任意一个数字
3.3.2 示例代码
Test
package Work;
import java.util.Random;
public class Test {
static Random random=new Random();
public static void main(String[] args) {
System.out.println("随机生成的二位数为: "+generateRandom());
}
public static int generateRandom(){
int number=0,unit=0,digit=0;
//number代表的是随机生成的两位数,unit代表个位,digit代表十位
for (int i = 0; i <2; i++) {
int temp=random.nextInt(10);
if(i==0){
//保证首位不为0,生成的是0就重新生成,这也是数据过滤的一种形式
while(temp==0){
temp=random.nextInt(10);
}
digit=temp;
}else{
unit=temp;
}
}
number=digit*10+unit;
return number;
}
}
3.3.3 示例代码运行截图
3.3.4 思路总结
a 把公式的首次执行放在第一行
b. if判断是否是特殊情况,若是则进入一个循环,结束循环的条件是公式得到的数
符合特殊情况的要求;进入循环的条件是得到的数不符合的条件;若不是则正常调用公式计算即可。
注意:当用公式生成的数不符合条件时,就会进入循环.直到生成符合条件的时候,条件判断不成立,那就可以跳出while循环了