【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关键字并不是太相关)

如果有错误或其他问题,请务必提出指正!

bannerAds