คำถามติดแท็ก final

22
อะไรคือ "ระดับสุดท้าย" ใน Java?
ฉันกำลังอ่านหนังสือเกี่ยวกับ Java และมันบอกว่าคุณสามารถประกาศทั้งชั้นfinalได้ ฉันไม่สามารถคิดถึงสิ่งที่ฉันจะใช้สิ่งนี้ ฉันเพิ่งใหม่กับการเขียนโปรแกรมและฉันสงสัยว่าโปรแกรมเมอร์ใช้สิ่งนี้กับโปรแกรมของพวกเขาหรือไม่หรือไม่ ถ้าพวกเขาทำพวกเขาจะใช้เมื่อใดฉันจึงสามารถเข้าใจได้ดีขึ้นและรู้ว่าควรใช้เมื่อไร ถ้า Java เป็นเชิงวัตถุและคุณประกาศคลาสfinalมันจะไม่หยุดความคิดของคลาสที่มีคุณสมบัติของวัตถุหรือไม่
569 java  final 

18
คำหลัก "สุดท้าย" ใน Java ทำงานอย่างไร (ฉันยังคงสามารถปรับเปลี่ยนวัตถุ)
ใน Java เราใช้finalคำหลักที่มีตัวแปรเพื่อระบุค่าของมันจะไม่เปลี่ยนแปลง แต่ฉันเห็นว่าคุณสามารถเปลี่ยนค่าในตัวสร้าง / วิธีการของชั้นเรียน อีกครั้งถ้าตัวแปรstaticนั้นเป็นข้อผิดพลาดในการรวบรวม นี่คือรหัส: import java.util.ArrayList; import java.util.List; class Test { private final List foo; public Test() { foo = new ArrayList(); foo.add("foo"); // Modification-1 } public static void main(String[] args) { Test t = new Test(); t.foo.add("bar"); // Modification-2 System.out.println("print - " + t.foo); } …
480 java  final 

11
เปลี่ยนฟิลด์สแตติกสุดท้ายส่วนตัวโดยใช้การสะท้อน Java
ฉันมีคลาสที่มีprivate static finalฟิลด์ที่โชคไม่ดีที่ฉันต้องเปลี่ยนมันในเวลาทำงาน ใช้การสะท้อนฉันได้รับข้อผิดพลาดนี้: java.lang.IllegalAccessException: Can not set static final boolean field มีวิธีการเปลี่ยนแปลงค่าหรือไม่? Field hack = WarpTransform2D.class.getDeclaredField("USE_HACK"); hack.setAccessible(true); hack.set(null, true);

12
เหตุใดฉันจึงควรใช้คำว่า“ final” บนพารามิเตอร์ method ใน Java?
ฉันไม่เข้าใจว่าfinalคำหลักนั้นมีประโยชน์จริง ๆเมื่อใช้กับพารามิเตอร์ของวิธี ถ้าเราไม่รวมการใช้คลาสที่ไม่ระบุชื่อการอ่านและการประกาศเจตนานั้นดูเหมือนว่าจะไร้ค่าสำหรับฉัน การบังคับใช้ว่าข้อมูลบางอย่างยังคงไม่คงที่เท่าที่ควร หากพารามิเตอร์เป็นแบบดั้งเดิมมันจะไม่มีผลกระทบเนื่องจากพารามิเตอร์ถูกส่งผ่านไปยังวิธีการเป็นค่าและการเปลี่ยนแปลงมันจะไม่มีผลนอกขอบเขต หากเราส่งพารามิเตอร์โดยการอ้างอิงตัวอ้างอิงเองนั้นเป็นตัวแปรในตัวเครื่องและหากการอ้างอิงนั้นเปลี่ยนจากภายในเมธอดนั่นจะไม่มีผลกระทบใด ๆ จากภายนอกขอบเขตของเมธอด ลองพิจารณาตัวอย่างทดสอบง่ายๆด้านล่าง การทดสอบนี้ผ่านแม้ว่าวิธีการจะเปลี่ยนค่าของการอ้างอิงที่ให้ แต่ก็ไม่มีผลใด ๆ public void testNullify() { Collection<Integer> c = new ArrayList<Integer>(); nullify(c); assertNotNull(c); final Collection<Integer> c1 = c; assertTrue(c1.equals(c)); change(c); assertTrue(c1.equals(c)); } private void change(Collection<Integer> c) { c = new ArrayList<Integer>(); } public void nullify(Collection<?> t) { t = null; …

14
ความแตกต่างระหว่างสุดท้ายและสุดท้ายได้อย่างมีประสิทธิภาพ
ฉันเล่นกับ lambdas ในชวา 8 local variables referenced from a lambda expression must be final or effectively finalและฉันมาข้ามคำเตือน ฉันรู้ว่าเมื่อฉันใช้ตัวแปรภายในคลาสนิรนามพวกเขาจะต้องเป็นคนสุดท้ายในชั้นนอก แต่ยัง - อะไรคือความแตกต่างระหว่างขั้นสุดท้ายและสุดท้ายอย่างมีประสิทธิภาพ ?

13
การใช้คำหลักสุดท้ายใน Java ปรับปรุงประสิทธิภาพหรือไม่
ใน Java เราเห็นสถานที่มากมายที่finalสามารถใช้คำหลักได้ แต่การใช้คำหลักนั้นผิดปกติ ตัวอย่างเช่น: String str = "abc"; System.out.println(str); ในกรณีข้างต้นstrอาจเป็นได้finalแต่นี่เป็นเรื่องปกติที่เหลือ เมื่อวิธีการจะไม่ถูกแทนที่เราสามารถใช้คำหลักสุดท้าย ในทำนองเดียวกันในกรณีของคลาสที่ไม่ได้รับการสืบทอด การใช้คำหลักสุดท้ายในกรณีเหล่านี้ใด ๆ หรือทั้งหมดปรับปรุงประสิทธิภาพหรือไม่? ถ้าเป็นเช่นนั้นได้อย่างไร กรุณาอธิบาย. หากการใช้งานที่เหมาะสมมีความfinalสำคัญอย่างยิ่งต่อการปฏิบัติงานจริงๆแล้วโปรแกรมเมอร์ Java ควรพัฒนานิสัยอย่างไรให้ใช้ประโยชน์จากคำหลักได้ดีที่สุด
347 java  final 

22
แอตทริบิวต์คงสุดท้ายส่วนตัวเทียบกับคุณลักษณะส่วนตัวสุดท้าย
ใน Java ความแตกต่างระหว่าง: private final static int NUMBER = 10; และ private final int NUMBER = 10; ทั้งสองprivateและfinalแตกต่างคือstaticคุณลักษณะ มีอะไรดีกว่ากัน และทำไม?

20
ไม่สามารถอ้างถึงตัวแปรที่ไม่ใช่ครั้งสุดท้ายภายในคลาสภายในที่กำหนดไว้ในวิธีการอื่น
แก้ไข: ฉันจำเป็นต้องเปลี่ยนค่าของตัวแปรหลายตัวในขณะที่พวกเขาทำงานหลายครั้งก่อนที่ตัวจับเวลา ฉันต้องการอัปเดตค่ากับการวนซ้ำทุกครั้งผ่านตัวจับเวลา ฉันไม่สามารถตั้งค่าเป็นค่าสุดท้ายได้ซึ่งจะทำให้ฉันไม่สามารถอัปเดตค่าได้ แต่ฉันได้รับข้อผิดพลาดที่ฉันอธิบายในคำถามเริ่มต้นด้านล่าง: ฉันเคยเขียนสิ่งที่อยู่ด้านล่าง: ฉันได้รับข้อผิดพลาด "ไม่สามารถอ้างถึงตัวแปรที่ไม่ใช่ครั้งสุดท้ายภายในคลาสภายในที่กำหนดในวิธีอื่น" สิ่งนี้เกิดขึ้นสำหรับราคาที่มีการเรียกสองครั้งและราคาที่เรียกว่า priceObject คุณรู้ไหมว่าทำไมฉันถึงได้รับปัญหานี้ ฉันไม่เข้าใจว่าทำไมฉันต้องมีการประกาศขั้นสุดท้าย นอกจากนี้หากคุณสามารถเห็นว่าฉันพยายามทำอะไรฉันต้องทำอะไรเพื่อแก้ไขปัญหานี้ public static void main(String args[]) { int period = 2000; int delay = 2000; double lastPrice = 0; Price priceObject = new Price(); double price = 0; Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { public void …

11
ควรจะมีการประกาศ“ ตัวบันทึกสุดท้ายแบบคงที่” ใน UPPER-CASE หรือไม่?
ใน Java ตัวแปรสแตติกสุดท้ายเป็นค่าคงที่และการประชุมคือว่าพวกเขาควรจะเป็นตัวพิมพ์ใหญ่ แต่ผมได้เห็นว่าคนส่วนใหญ่ประกาศตัดไม้ในกรณีที่ต่ำกว่าซึ่งขึ้นมาเป็นการละเมิดในPMD เช่น: private static final Logger logger = Logger.getLogger(MyClass.class); เพียงค้นหาgoogleหรือSOเพื่อ "static final logger" และคุณจะเห็นสิ่งนี้ด้วยตัวคุณเอง เราควรใช้ LOGGER แทนหรือไม่

6
การเปรียบเทียบสตริงด้วย == ซึ่งประกาศเป็นครั้งสุดท้ายใน Java
ฉันมีคำถามง่ายๆเกี่ยวกับสตริงใน Java ==ส่วนต่อไปนี้รหัสง่ายๆเพียงเชื่อมสองสายแล้วเปรียบเทียบพวกเขาด้วย String str1="str"; String str2="ing"; String concat=str1+str2; System.out.println(concat=="string"); การเปรียบเทียบการแสดงออกconcat=="string"กลับมาfalseชัดเจน (ฉันเข้าใจความแตกต่างระหว่างequals()และ==) เมื่อทั้งสองสายมีการประกาศfinalเช่นนั้น final String str1="str"; final String str2="ing"; String concat=str1+str2; System.out.println(concat=="string"); การแสดงออกการเปรียบเทียบในกรณีที่ผลตอบแทนนี้concat=="string" trueทำไมถึงfinalสร้างความแตกต่าง? มันต้องทำอะไรบางอย่างกับสระว่ายน้ำฝึกงานหรือฉันแค่หลงผิด?
220 java  string  final 

5
อาร์กิวเมนต์สุดท้ายในวิธีการเชื่อมต่อ - ประเด็นคืออะไร?
ใน Java การกำหนดfinalอาร์กิวเมนต์ในเมธอดอินเทอร์เฟซนั้นถูกกฎหมายอย่างสมบูรณ์และไม่ปฏิบัติตามในคลาสการนำไปใช้งานเช่น: public interface Foo { public void foo(int bar, final int baz); } public class FooImpl implements Foo { @Override public void foo(final int bar, int baz) { ... } } ในตัวอย่างข้างต้นbarและbazมีfinalคำจำกัดความที่ตรงกันข้ามในคลาส VS อินเทอร์เฟซ ในทำนองเดียวกันไม่มีการfinalบังคับใช้ข้อ จำกัด ใด ๆ เมื่อเมธอดคลาสหนึ่งขยายอีกวิธีหนึ่งabstractหรือไม่ก็ได้ ในขณะที่finalมีค่าที่ใช้งานได้จริงบางส่วนในตัวเมธอดคลาสมีจุดใดบ้างที่ระบุfinalสำหรับพารามิเตอร์วิธีการอินเทอร์เฟซ?
192 java  class  interface  methods  final 

6
การกำหนดครั้งสุดท้ายไม่ดีหรือไม่?
ก่อนอื่นตัวต่อ: รหัสต่อไปนี้จะพิมพ์อะไร public class RecursiveStatic { public static void main(String[] args) { System.out.println(scale(5)); } private static final long X = scale(10); private static long scale(long value) { return X * value; } } ตอบ: 0 สปอยเลอร์ด้านล่าง หากคุณพิมพ์Xในขนาด (ยาว) และ Redefine X = scale(10) + 3พิมพ์จะได้รับแล้วX = 0 X = 3ซึ่งหมายความว่าXมีการตั้งค่าชั่วคราวและการตั้งค่าในภายหลัง0 …

11
เหตุผลที่ดีที่จะห้ามการสืบทอดใน Java?
มีเหตุผลอะไรที่ดีที่จะห้ามการสืบทอดใน Java เช่นโดยใช้คลาสสุดท้ายหรือคลาสที่ใช้คอนสตรัคเตอร์แบบไม่มีพารามิเตอร์ตัวเดียว? อะไรคือเหตุผลที่ดีในการทำให้วิธีการเป็นที่สิ้นสุด?
178 java  inheritance  final 


15
เมื่อใดจึงควรใช้ขั้นสุดท้ายสำหรับพารามิเตอร์เมธอดและตัวแปรโลคัล?
ฉันได้พบการอ้างอิงสองสามข้อ ( เช่น ) ที่แนะนำให้ใช้finalมากที่สุดเท่าที่จะเป็นไปได้และฉันสงสัยว่ามันสำคัญแค่ไหน นี่คือส่วนใหญ่ในบริบทของพารามิเตอร์วิธีการและตัวแปรท้องถิ่นไม่ใช่วิธีการสุดท้ายหรือชั้นเรียน สำหรับค่าคงที่มันสมเหตุสมผลดี ในอีกด้านหนึ่งคอมไพเลอร์สามารถทำการเพิ่มประสิทธิภาพบางอย่างและทำให้เจตนาของโปรแกรมเมอร์ชัดเจนยิ่งขึ้น ในทางตรงกันข้ามมันเพิ่มความฟุ่มเฟื่อยและการเพิ่มประสิทธิภาพอาจเล็กน้อย เป็นสิ่งที่ฉันควรจะพยายามจดจำหรือไม่?
171 java  final 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.