【Java】static是什么意思
我是第一次投稿。
在读完牛尾刚先生的《世界一流エンジニアの思考法》后,我受到了极大的启发,立刻决定彻底地重新学习我目前在项目中使用的Java和Spring Boot的基础知识。
虽然我作为一名工程师已经有6年的经验,但我之前对Java的理解只是表面上的,一直依赖搜索引擎或者参考其他程序员的样例来应对工作,真可谓是三流的工程师。
首先,我开始阅读经典书籍之一的《Effective Java 第3版》,这本书讲述了Java的基础知识。
开始阅读后不久,我遇到了一个疑问,即什么是静态工厂方法?
实际上,我对静态方法这个概念理解得如何?是否理解得不够清楚?
那么首先我们要好好理解一下static的概念。
静态成员是指总结来说,它是“与类相关联而不是与实例相关联的成员”。
我正好在業務上遇到一個很好的例子,利用它來整理一下。
我希望通过今天的任务解决以下问题:
“我想对从CSV导入的值进行验证,以使其与最终数据协调的目标数据库的位数相匹配”
(实际上,我觉得这个问题之前应该已经处理过了)
首先,我试着写了一个这样的处理过程。
String strNum = "1234.5678" // ほんとはcsvから読み取った値
try {
BigDecimal bigDecimalNum = new BigDecimal(strNum);
if (bigDecimalNum.precision() - bigDecimalNum.scale() > 30 || bigDecimalNum.scale() > 5) {
// 桁数チェックエラーの処理
}
} catch e {
// 数値以外が入ってきた場合の例外処理
}
然而,因为数字的连在一起的写法有点让人在意,所以我向架构师咨询了一下。
(顺便说一句,这位架构师是一个非常优秀的工程师。他使用的编辑器是秀丸w)
我试着进行了改进,具体如下。 (Wǒ , .)
最初为了数据协调而实施的数值项类,基本上按照以下的方式实现。
public class numValue {
private BigDecimal value;
// コンストラクタ
public numValue(BigDecimal value) {
this.value = value;
}
public BigDecimal getValue() {
return value;
}
}
在那里,这样添加。
public class numValue {
private BigDecimal value;
static final int INTEGER_LENGTH_LIMIT = 30; // staticなメンバ
static final int DECIMAL_LENGTH_LIMIT = 5; // staticなメンバ
// コンストラクタ
public numValue(BigDecimal value) {
this.value = value;
}
public BigDecimal getValue() {
return value;
}
public static boolean isValidLength(BigDecimal value) {
if (value.precision() - value.scale() > INTEGER_LENGTH_LIMIT
|| value.scale() > DECIMAL_LENGTH_LIMIT
) {
return false;
}
return true;
}
}
是的,静态成员已经出现。
首先是非静态成员 value。
这是与通过 new numValue(value) 生成的实例相关联的成员。
numValue num1 = new numValue(new BigDecimal(123.45));
numValue num2 = new numValue(new BigDecimal(67.89));
每个实例都有不同的值,不是吗?
在静态成员这一方面,无论是num1还是num2都具有相同的值。
甚至可以在不实例化的情况下引用这些值。
System.out.println(num1.INTEGER_LENGTH_LIMIT); // 30
System.out.println(num2.INTEGER_LENGTH_LIMIT); // 30
System.out.println(numValue.INTEGER_LENGTH_LIMIT); // 30
这是因为这个成员与班级有关联的成员。
最后再总结一次
静态成员:与类相关联的成员
这是我对static的理解的总结。(但如果有人问到static类,我还不能解释,所以我会再学习并写下来。)
額外討論:靜態工廠方法在这里实现的 isValidLength 方法是一个疑问的起点,它是一个静态工厂方法。我们充分享受了静态工厂方法的一个优点,就是可以返回任意子类型的对象作为方法的返回类型(除此之外,还有其他的优点,我会在后面详细说明)。
我将使用这个方法来修复初始的代码。
String strNum = "1234.5678" // ほんとはcsvから読み取った値
try {
BigDecimal bigDecimalNum = new BigDecimal(strNum);
if (!bigDecimalNum.isValidLength) {
// 桁数チェックエラーの処理
}
} catch e {
// 数値以外が入ってきた場合の例外処理
}
不再需要将常数硬编码到业务逻辑中,这让代码看起来更加清晰简洁。(或许static关键字并不是太相关)
如果有错误或其他问题,请务必提出指正!