final
มีการใช้หลายตัวแปรที่มี นี่เป็นเพียงไม่กี่
ค่าคงที่สุดท้าย
public static class CircleToolsBetter {
public final static double PI = 3.141;
public double getCircleArea(final double radius) {
return (Math.pow(radius, 2) * PI);
}
}
สิ่งนี้สามารถนำไปใช้กับส่วนอื่น ๆ ของรหัสของคุณหรือเข้าถึงได้โดยคลาสอื่น ๆ ด้วยวิธีนี้หากคุณเคยเปลี่ยนค่าที่คุณไม่ต้องเปลี่ยนพวกเขาทีละคน
ตัวแปรสุดท้าย
public static String someMethod(final String environmentKey) {
final String key = "env." + environmentKey;
System.out.println("Key is: " + key);
return (System.getProperty(key));
}
}
ในคลาสนี้คุณสร้างตัวแปรสุดท้ายที่กำหนดขอบเขตซึ่งเพิ่มคำนำหน้าให้กับพารามิเตอร์ environmentKey ในกรณีนี้ตัวแปรสุดท้ายจะถือเป็นที่สุดเท่านั้นภายในขอบเขตการดำเนินการซึ่งแตกต่างกันในแต่ละการดำเนินการของวิธีการ ทุกครั้งที่มีการป้อนวิธีการขั้นสุดท้ายจะถูกสร้างขึ้นใหม่ ทันทีที่มันถูกสร้างขึ้นมันจะไม่สามารถเปลี่ยนแปลงได้ในระหว่างการดำเนินการของขอบเขต สิ่งนี้ช่วยให้คุณสามารถแก้ไขตัวแปรในวิธีสำหรับช่วงเวลาของวิธีการ ดูด้านล่าง:
public class FinalVariables {
public final static void main(final String[] args) {
System.out.println("Note how the key variable is changed.");
someMethod("JAVA_HOME");
someMethod("ANT_HOME");
}
}
ค่าคงที่สุดท้าย
public double equation2Better(final double inputValue) {
final double K = 1.414;
final double X = 45.0;
double result = (((Math.pow(inputValue, 3.0d) * K) + X) * M);
double powInputValue = 0;
if (result > 360) {
powInputValue = X * Math.sin(result);
} else {
inputValue = K * Math.sin(result); // <= Compiler error
}
สิ่งเหล่านี้มีประโยชน์โดยเฉพาะอย่างยิ่งเมื่อคุณมีรหัสยาว ๆ และมันจะสร้างข้อผิดพลาดของคอมไพเลอร์ดังนั้นคุณจะไม่เรียกใช้ข้อผิดพลาดทางตรรกะ / ธุรกิจเมื่อมีคนเปลี่ยนตัวแปรที่ไม่ควรเปลี่ยนโดยไม่ตั้งใจ
คอลเลกชันสุดท้าย
กรณีที่แตกต่างกันเมื่อเรากำลังพูดถึงคอลเลกชันคุณจะต้องตั้งค่าให้พวกเขาเป็น unmodifiable
public final static Set VALID_COLORS;
static {
Set temp = new HashSet( );
temp.add(Color.red);
temp.add(Color.orange);
temp.add(Color.yellow);
temp.add(Color.green);
temp.add(Color.blue);
temp.add(Color.decode("#4B0082")); // indigo
temp.add(Color.decode("#8A2BE2")); // violet
VALID_COLORS = Collections.unmodifiableSet(temp);
}
มิฉะนั้นหากคุณไม่ตั้งเป็น unmodifiable:
Set colors = Rainbow.VALID_COLORS;
colors.add(Color.black); // <= logic error but allowed by compiler
ชั้นเรียนสุดท้ายและวิธีสุดท้ายไม่สามารถขยายหรือเขียนทับได้ตามลำดับ
แก้ไข: เพื่อระบุปัญหาระดับสุดท้ายที่เกี่ยวกับการคำนวณ:
มีสองวิธีในการทำให้ชั้นเรียนเป็นขั้นสุดท้าย สิ่งแรกคือการใช้คำสำคัญสุดท้ายในการประกาศคลาส:
public final class SomeClass {
// . . . Class contents
}
วิธีที่สองในการทำให้คลาสสุดท้ายคือประกาศสิ่งก่อสร้างทั้งหมดเป็นแบบส่วนตัว:
public class SomeClass {
public final static SOME_INSTANCE = new SomeClass(5);
private SomeClass(final int value) {
}
การทำเครื่องหมายเป็นขั้นสุดท้ายช่วยให้คุณประหยัดปัญหาหากพบว่าเป็นขั้นตอนสุดท้ายเพื่อแสดงให้เห็นถึงคลาสทดสอบนี้ ดูสาธารณะได้อย่างรวดเร็วก่อน
public class Test{
private Test(Class beanClass, Class stopClass, int flags)
throws Exception{
// . . . snip . . .
}
}
น่าเสียดายเนื่องจากคอนสตรัคเตอร์เฉพาะของคลาสนั้นเป็นแบบส่วนตัวจึงไม่สามารถขยายคลาสนี้ได้ ในกรณีของคลาสทดสอบไม่มีเหตุผลที่คลาสควรเป็นที่สิ้นสุด คลาสการทดสอบเป็นตัวอย่างที่ดีของวิธีการที่คลาสสุดท้ายโดยนัยสามารถทำให้เกิดปัญหาได้
ดังนั้นคุณควรทำเครื่องหมายเป็นขั้นสุดท้ายเมื่อคุณสร้างคลาสโดยปริยายโดยทำให้เป็นคอนสตรัคเตอร์ส่วนตัว