แบบแผนการตั้งชื่อ: ฟิลด์สุดท้าย (ไม่คงที่)


23

วันนี้ฉันได้พูดคุยกับเพื่อนร่วมงานเกี่ยวกับการตั้งชื่อfinalฟิลด์ในคลาส Java

ในfinalฟิลด์โอปี้ของเขาควรได้รับการพิจารณาว่าเป็นค่าคงที่เนื่องจากค่าของมันจะไม่เปลี่ยนแปลงหลังจากการสร้างอินสแตนซ์

สิ่งนี้จะนำไปสู่หลักการตั้งชื่อต่อไปนี้สำหรับfinalฟิลด์:

public class Foo {
    private static final String BLA_BLA = "bla";

    private final String BAR_BATZ;

    ...
}

ในความเห็นของฉันstatic finalควรพิจารณาเฉพาะเขตข้อมูลในขณะที่เขตข้อมูลที่finalควรปฏิบัติตามหลักการตั้งชื่อ camelCase ตามปกติเท่านั้น

public class Foo {
    private static final String BLA = "bla";

    private final String barBatz;

    ...
}

ตอนนี้ฉันค่อนข้างไม่แน่ใจเพราะเขาเป็นโปรแกรมเมอร์ที่มีประสบการณ์มากกว่าฉันและฉันมักจะเห็นด้วยกับความคิดเห็นของเขาและถือว่าเขาเป็นนักพัฒนาที่ดีมาก

ข้อมูลใด ๆ เกี่ยวกับเรื่องนี้?


ตัวอย่างของคุณไม่ใช่ค่าคงที่ คุณยังไม่ได้กำหนดค่าใด ๆ ให้กับพวกเขาในเวลารวบรวม ดังนั้นพวกเขาไม่ปฏิบัติตามอนุสัญญาการตั้งชื่อสำหรับค่าคงที่
Robert Harvey

@ RobertHarvey ขอบคุณคุณพูดถูก สิ่ง...นี้มีไว้เพื่อเป็นสัญลักษณ์ของตัวสร้างที่เป็นไปได้ใด ๆ ที่ตั้งค่าfinalฟิลด์ แต่ไม่ชัดเจนสำหรับstatic finalฟิลด์
Sascha Wolf

1
@Zeeker คุณอาจสนใจstatic { }บล็อกที่สามารถใช้ตั้งค่าฟิลด์สแตติกภายในคลาสหนึ่งครั้งเมื่อโหลดคลาสแล้ว ที่เกี่ยวข้องในการทำงานกับตัวสร้างแบบคงที่ใน Java

@ RobertHarvey ฉันคุ้นเคยกับสิ่งเหล่านั้น แต่ขอบคุณอย่างไรก็ตาม
Sascha Wolf

1
ฉันจะบอกว่าเนื่องจากตัวแปรเป็นของอินสแตนซ์มันจะแตกต่างจากอินสแตนซ์กับอินสแตนซ์ดังนั้นจึงไม่ใช้เป็นค่าคงที่ ฉันจะใช้กรณีอูฐ
Florian F

คำตอบ:


20

ดวงอาทิตย์ (และตอนนี้ออราเคิล) การเก็บรักษาเอกสารชื่ออนุสัญญารหัสสำหรับ Java Programming Language การอัปเดตครั้งล่าสุดนี้เป็นปี 99 แต่สาระสำคัญของเส้นบอกแนวสไตล์ใช้งานได้

บทที่ 9ครอบคลุมอนุสัญญาการตั้งชื่อ

สำหรับประเภทตัวระบุของ 'ค่าคงที่':

ชื่อของตัวแปรที่ประกาศค่าคงที่คลาสและค่าคงที่ ANSI ควรเป็นตัวพิมพ์ใหญ่ทั้งหมดด้วยคำที่คั่นด้วยเครื่องหมายขีดล่าง ("_") (ควรหลีกเลี่ยงค่าคงที่ ANSI เพื่อความสะดวกในการดีบัก)

ตัวอย่างที่ได้รับ:

static final int MIN_WIDTH = 4;

static final int MAX_WIDTH = 999;

static final int GET_THE_CPU = 1;

ในเอกสารที่ใหม่กว่า - มันเลื่อนไปที่นั่น จากตัวแปร (บทเรียน Java> การเรียนรู้ภาษา Java> พื้นฐานภาษา :

หากชื่อที่คุณเลือกประกอบด้วยเพียงหนึ่งคำให้สะกดคำนั้นด้วยตัวอักษรตัวพิมพ์เล็กทั้งหมด หากประกอบด้วยมากกว่าหนึ่งคำให้ใช้ตัวอักษรตัวแรกของคำต่อ ๆ ไปเป็นตัวพิมพ์ใหญ่ ชื่อgearRatioและcurrentGearเป็นตัวอย่างสำคัญของอนุสัญญานี้ หากตัวแปรของคุณเก็บค่าคงที่เช่นstatic final int NUM_GEARS = 6การประชุมเปลี่ยนแปลงเล็กน้อยการใช้อักษรตัวพิมพ์ใหญ่ทุกตัวและแยกคำที่ตามมาด้วยอักขระขีดล่าง โดยการประชุมตัวละครขีดเส้นใต้จะไม่เคยใช้ที่อื่น

เครื่องมือวิเคราะห์สแตติกจำนวนมากสำหรับ Java พยายามบังคับใช้สิ่งนี้ ยกตัวอย่างเช่นCheckstyleบังคับใช้:

ตรวจสอบว่าชื่อคงที่เป็นไปตามรูปแบบที่ระบุโดยคุณสมบัติรูปแบบ คงเป็นแบบคงที่และสนามสุดท้ายหรือสนามอินเตอร์เฟซ / คำอธิบายประกอบยกเว้นและserialVersionUID รูปแบบคือการแสดงออกปกติและค่าเริ่มต้นserialPersistentFields^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$


สิ่งนี้ทำให้การประชุมของชุมชนต้องเขียนรหัส ... และทำให้มันคงเดิม

ตัวอย่างข้างต้นจะได้รับเป็นตัวอย่างstatic finalที่มีแนวโน้มว่าจะได้รับจากอนุสัญญา C สำหรับ#define- ซึ่งเช่น C จะถูกแทนที่ในรหัสในระหว่างการรวบรวมมากกว่าที่รันไทม์

คำถามที่ควรถามก็คือ "สิ่งนี้ทำตัวเหมือนค่าคงที่หรือไม่หรือมันทำตัวเหมือนเขียนครั้งเดียวหรือไม่?" - จากนั้นทำตามอนุสัญญาตามนั้น การทดสอบสารสีน้ำเงินสำหรับคำถามดังกล่าวจะเป็น "ถ้าคุณต้องทำให้เป็นอันดับวัตถุคุณจะรวมเขตข้อมูลสุดท้ายหรือไม่?" หากคำตอบคือว่ามันคงที่ให้ทำเช่นนั้น (และอย่าทำให้เป็นอันดับ) ในทางตรงกันข้ามถ้ามันเป็นส่วนหนึ่งของสถานะของวัตถุที่จะต้องต่อเนื่องกันแล้วมันไม่คงที่

ไม่ว่ากรณีใดมันเป็นสิ่งสำคัญที่จะยึดติดอยู่กับสไตล์ของรหัส แต่ถูกหรือผิด ปัญหาที่เลวร้ายยิ่งปะทุขึ้นจากอนุสัญญาที่ไม่สอดคล้องภายในโครงการกว่าสิ่งที่ทำให้ตาขุ่นเคือง พิจารณารับเครื่องมือวิเคราะห์แบบคงที่และกำหนดค่าให้รักษาความสอดคล้อง



@RobertHarvey ฉันสามารถนึกถึงบางสถานการณ์ที่เขตข้อมูลอินสแตนซ์ทำงานเป็นค่าคงที่ ยกตัวอย่างเช่นโรงงานบรรจุสิ่งที่ไม่คงที่ในวัตถุ ... ถึงแม้ว่าสิ่งเหล่านี้จะเป็นตัวอย่างที่ประดิษฐ์ขึ้นมาค่อนข้างเจ็บที่หัวของฉันแค่คิดว่าทำไมคนถึงทำอย่างนั้น

ขอบคุณสำหรับคำตอบโดยละเอียดนี้ การทดสอบสารสีน้ำเงินเกี่ยวกับการทำให้เป็นอันดับของวัตถุทำให้ฉันจัดการ
Sascha Wolf

เพื่อนร่วมงานทำประเด็นที่ถูกต้องเมื่อไม่นานมานี้ว่าบรรณาธิการกาลครั้งหนึ่งไม่ดีในการเน้นรอบชิงชนะเลิศแบบคงที่ / แบบคงที่ ฯลฯ ดังนั้นการตั้งชื่อแบบนี้จึงมีความสำคัญ เหล่านี้ IDEs วันจะสวยดีดังนั้นเราอาจจะสามารถทำให้ดีกว่ามองชื่อสำหรับพวกเขาเช่น: แทนMinWidth MIN_WIDTHคำถามอื่นคือ: สิ่งที่เกี่ยวกับการบันทึกสุดท้ายคงที่ คุณเรียกพวกเขาLOG/ LOGGERหรือ/log loggerโดยส่วนตัวแล้วlogดูดีกว่าด้วยโค้ด แต่เมื่อใดที่ไม่สอดคล้องกันจะยอมรับได้เมื่อทั้งหมด?
ndtreviv

5

BAR_BATZไม่คงที่ในตัวอย่างนี้ คอนสตรัคของFooสามารถตั้งค่าต่าง ๆ ในระดับวัตถุ ตัวอย่างเช่น

public class Foo {
    private final String BAR_BATZ;

    Foo() {
       BAR_BATZ = "ascending";
    } 

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