设计一个Person类,包括年龄、工资等个人隐私信息(隐私信息不能随意被查看),并且对设置的年龄进行验证,年龄合理就设置,年龄不合理就赋一个默认值。 要求:年龄在1-120之间,工资不允许直接查看,姓名的字符串长度在2-8之间,要求使用set和get
时间: 2024-09-28 12:14:40 浏览: 53
设计一个名为`Person`的类,我们可以考虑如下结构:
```java
import java.util.ArrayList;
import java.util.List;
class Person {
private String name; // 姓名,长度限制2-8字符
private int age; // 年龄,范围限制1-120岁,初始值设为默认
private double salary; // 工资,私有属性,不允许直接获取
private static final int DEFAULT_AGE = 18;
private static final int AGE_RANGE_MIN = 1;
private static final int AGE_RANGE_MAX = 120;
private static final int NAME_LENGTH_MIN = 2;
private static final int NAME_LENGTH_MAX = 8;
public Person(String name) {
if (isValidName(name)) {
this.name = name;
} else {
throw new IllegalArgumentException("Invalid name length. Name should be between " + NAME_LENGTH_MIN + " and " + NAME_LENGTH_MAX);
}
this.age = getValidAge();
this.salary = 0.0; // 初始化工资,实际项目中可能需要其他处理
}
// 验证年龄并设置
private int getValidAge() {
int inputAge = validateAge(getUserInput("Enter your age: "));
return inputAge >= AGE_RANGE_MIN && inputAge <= AGE_RANGE_MAX ? inputAge : DEFAULT_AGE;
}
private int validateAge(String input) {
try {
int age = Integer.parseInt(input);
return age;
} catch (NumberFormatException e) {
System.out.println("Invalid age format. Please enter a number.");
return DEFAULT_AGE;
}
}
// 验证姓名长度
private boolean isValidName(String name) {
return name.length() >= NAME_LENGTH_MIN && name.length() <= NAME_LENGTH_MAX;
}
// 设置姓名,只允许修改一次
public void setName(String newName) {
if (!isValidName(newName)) {
throw new IllegalArgumentException("Invalid name length. Name should be between " + NAME_LENGTH_MIN + " and " + NAME_LENGTH_MAX);
}
this.name = newName;
}
// 获取姓名,保护个人信息
public String getName() {
return name;
}
// 设置年龄,内部会验证并调整
public void setAge(int age) {
this.age = getValidAge();
}
// 获取工资,模拟保护,实际上应提供访问者模式或其他方式限制
private double getSalary() {
throw new UnsupportedOperationException("Salary is not accessible directly.");
}
// 可能的用户输入操作
private int getUserInput(String prompt) {
Scanner scanner = new Scanner(System.in);
return scanner.nextInt();
}
// 其他辅助方法或getter方法可以在此添加...
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
```
在这个例子中,我们创建了一个`Person`类,包含了姓名、年龄和工资属性,并通过`setName`和`setAge`方法设置了对应的验证和默认值。`getSalary`方法仅抛出异常表示工资不可直接获取,实际应用中可以采用访问者模式或代理模式来实现访问控制。
阅读全文