我有一个名为Person的类,它看起来像这样:
public abstract class Person {
private String birthNo;
...
}
挪威出生数字长11位,由on this Wikipedia page描述的算法构成。我不能使用int,因为大多数出生数超过Integer.MAX_VALUE
。
我听说在决定是否应该使用字符串或整数来存储数值时,您应该问自己:我是否需要对此值执行数学运算?
我在birthNo
上这样做,但是使用String的charAt(int i)
,很多操作变得更容易了。如果我将出生数存储为长,我将不得不使用模数和除法来得到所需的数字:
int ninth = Character.getNumericValue(birthNo.charAt(8));
VS。
int ninth = birthNo / 100 % 10
我想要做的数学运算是获得人的性别(女性,如果第9位是偶数),并使用类似于ISBN的算法验证出生数。
使用String的另一个参数是,如果存储为long,则某些出生号将具有前导零,因此不是“11位”。
首选解决方案是什么?长期用于数学运算,还是为了方便而使用String?
答案 0 :(得分:3)
挪威十一位数的出生编号是在出生时分配的 在国家人口登记处登记。寄存器是 由挪威税务局维护。它由日期组成 出生(DDMMYY),一个三位数的个人号码和两个校验位。
我很想创建一个BirthNumber
课程,其出生日期为LocalDate
,其他两个字段的值为int
或String
,具体取决于你在做什么这样你就可以解析构造函数中的出生号,并使用实例方法获得所需的值。
根据以下评论,这里是我如何包装出生日期:
import java.time.LocalDate;
public class DNumberLocalDate {
private final LocalDate localDate;
private final boolean isDNumber;
public DNumberLocalDate(LocalDate localDate, boolean isDNumber) {
this.localDate = localDate;
this.isDNumber = isDNumber;
}
public DNumberLocalDate(LocalDate localDate) {
this(localDate, false);
}
public int getDayOfMonth() {
return isDNumber ? localDate.getDayOfMonth() + 40 : localDate.getDayOfMonth();
}
}
答案 1 :(得分:2)
出生编号是一个ID但不是数字:您不想在其上使用数学运算。在您的示例中,您希望拆分ID以查找某些信息,但您不想将其划分。因此,您应该使用String
。另一个原因是你所说的引导零,一个数字无法处理它。
但是,您可以使用BigDecimal
或BigInteger
作为大号。
答案 2 :(得分:-1)
一个字符串可以代表一个基本整数(领先0和更多) 因此,您应该将其存储为String并将其设置为私有。 你可以为每种类型定义2个geter方法1。 如果您想拥有oop代码,请不要直接访问vars。 格尔茨