เมื่อใดจึงควรใช้ค่า Null ของ Boolean


159

Java booleanช่วยให้ค่าของtrueและfalseในขณะที่บูลีนช่วยให้true, และfalse nullฉันได้เริ่มแปลงของฉันbooleanเป็นBooleans ซึ่งอาจทำให้เกิดปัญหาในการทดสอบเช่น

Boolean set = null;
...
if (set) ...

ในขณะที่การทดสอบ

if (set != null && set) ...

ดูเหมือนว่าวางแผนไว้แล้วและเกิดข้อผิดพลาดได้ง่าย

เมื่อใดจะมีประโยชน์เมื่อใช้Booleans ด้วยค่า Null หรือไม่? ถ้าไม่เป็นเช่นนั้นแล้วสิ่งที่เป็นข้อได้เปรียบหลักของวัตถุที่ถูกห่อคืออะไร?

UPDATE: มีคำตอบที่มีค่ามากมายที่ฉันได้สรุปบางคำตอบในคำตอบของฉัน ฉันเป็นสื่อกลางที่ดีที่สุดใน Java ดังนั้นฉันจึงพยายามแสดงสิ่งที่ฉันคิดว่ามีประโยชน์ โปรดทราบว่าคำถามคือ "ใช้ถ้อยคำไม่ถูกต้อง" (บูลีนไม่สามารถ "มีค่า Null") แต่ฉันได้ทิ้งไว้ในกรณีที่คนอื่นมีความเข้าใจผิดที่เหมือนกัน


7
บางครั้งคุณต้องการสถานะที่ไม่ได้กำหนดค่าเริ่มต้นและตั้งค่าBooleanตัวแปรเป็นตัวnullช่วย
nhahtdh

2
"เสมอ" ค่อนข้างแข็งแกร่งที่ฉันไม่กล้ายืนยัน แต่ฉันคาดว่าจะได้รับการทดสอบnullว่ามันถูกใช้เป็นสถานะที่ 3 หรือไม่
nhahtdh

6
คุณมีเหตุผลที่จะเปลี่ยนบูลีนเป็นบูลีนหรือไม่? ฉันจะยึดติดกับประเภทดั้งเดิมและปิดมันเฉพาะในกรณีที่มีเหตุผลที่ดีที่จะทำเช่นเมื่อฉันต้องผ่านตัวแปรโดยการอ้างอิง
jpe

7
คุณอาจต้องการตรวจสอบสิ่งนี้: thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx
biziclop

6
ไม่มีสิ่งเช่น "ค่า Null ใน Boolean" A Booleanคือวัตถุในขณะที่ a booleanคือ "เซนต์คิตส์และเนวิส" ถ้าการBooleanอ้างอิงถูกตั้งค่าเป็น null นั่นหมายความว่าBooleanวัตถุที่เกี่ยวข้องไม่มีอยู่ คุณไม่สามารถวางสิ่งใดในสิ่งที่ไม่มี
เลียน่าสนใจ

คำตอบ:


244

ใช้booleanแทนBooleanทุกครั้งที่ทำได้ สิ่งนี้จะหลีกเลี่ยงหลาย ๆNullPointerExceptionและทำให้รหัสของคุณแข็งแกร่งขึ้น

Boolean มีประโยชน์เช่น

  • เพื่อจัดเก็บบูลีนในกลุ่ม (รายการแผนที่และอื่น ๆ )
  • เพื่อแสดงบูลีน nullable (มาจากคอลัมน์บูลีน nullable ในฐานข้อมูลเป็นต้น) ค่า Null อาจหมายถึง "เราไม่รู้ว่ามันจริงหรือเท็จ" ในบริบทนี้
  • แต่ละครั้งที่วิธีต้องการวัตถุเป็นอาร์กิวเมนต์และคุณต้องผ่านค่าบูลีน MessageFormat.format()ตัวอย่างเช่นเมื่อใช้สะท้อนหรือวิธีการเช่น

35
ค่า Null ในฐานข้อมูลอาจหมายถึง"FileNotFound"
Karl Johan

31
สัญลักษณ์แสดงหัวข้อย่อยของคุณเป็นแกนหลักของคำตอบที่ถูกต้องสำหรับคำถามนี้ฉันคิดว่า
Niels Brinch

3
การใช้งานแบบบูลีนที่ฉันเคยมีก็คือเป็นพารามิเตอร์ประเภททั่วไปเมื่อขยายชั้นเรียนทั่วไป - เกี่ยวข้องอย่างใกล้ชิดกับจุดที่ 3
อเล็กซ์

6
การบรรทุกเกินพิกัดของโมฆะด้วยความหมายอื่นที่ไม่ใช่ "จักรวาลไม่รู้" มันอ่อนแอกว่าการใช้ enum ที่มีค่า 3 (หรือมากกว่า) ทำให้การอ่านรหัสผ่านพารามิเตอร์เป็นวิธีที่ชัดเจนยิ่งขึ้นเช่นกัน
bluevector

16
หรือ # 4: Boolean isSchrodinger‎CatAlive = null;(ขออภัยไม่สามารถต้านทานได้))
Matthieu

58

ฉันแทบไม่เคยใช้เลยBooleanเพราะความหมายของมันนั้นคลุมเครือและคลุมเครือ โดยทั่วไปคุณมีตรรกะ 3 สถานะ: จริงเท็จหรือไม่รู้จัก บางครั้งมันมีประโยชน์ที่จะใช้เมื่อคุณให้ผู้ใช้เลือกระหว่างสองค่าและผู้ใช้ไม่ได้ตอบเลยและคุณต้องการทราบข้อมูลนั้นจริงๆ (คิดว่า: คอลัมน์ฐานข้อมูลที่เป็นโมฆะ)

ฉันเห็นเหตุผลที่จะแปลงจากไม่มีbooleanที่จะBooleanเป็นค่าใช้จ่ายมันแนะนำหน่วยความจำเสริมความเป็นไปได้ NPE และการพิมพ์น้อย โดยปกติผมใช้ที่น่าอึดอัดใจBooleanUtils.isTrue()ที่จะทำให้ชีวิตของฉันนิด ๆ หน่อย ๆ Booleanง่ายขึ้นด้วย

เหตุผลเดียวสำหรับการดำรงอยู่ของBooleanคือความสามารถในการมีคอลเลกชันBooleanประเภท (generics ไม่อนุญาตbooleanเช่นเดียวกับดั้งเดิมอื่น ๆ ทั้งหมด)


1
มันเป็นห้องสมุดภายนอก (Apache Commons)
พฤศจิกายน

4
สำหรับตรรกะแบบหลายค่าควรใช้ enums ดังนั้นบูลีนควรถูกทิ้งไว้สำหรับตัวแปรมวยอัตโนมัติเพื่อใช้ในโครงสร้างข้อมูล
jpe

39
เมื่อใช้บูลีนการทดสอบที่สะดวกในการหลีกเลี่ยงข้อยกเว้นตัวชี้โมฆะหรือBoolean.TRUE.equals(myBooleanObject) Boolean.FALSE.equals(myBooleanObject)
Christopher Peisert

10
บูลีนวัตถุที่มีเพียงสองรัฐ - และ true คือไม่ได้รัฐของวัตถุ แต่สถานะของการอ้างอิงวัตถุ falsenull
เลียน่าสนใจ

2
ปล่อยให้อาปาเช่คอมมอนให้เป็นแบบ "ใครบางคนอาจพลาดการประเมินบูลีน ... ลองทำisTrue()วิธีการ ... " ซึ่งฟังดูเป็นสิ่งที่โง่ที่สุดในประวัติศาสตร์ของฟังก์ชั่นยูทิลิตี้ และยังมีประโยชน์ ... นั่นคือ wtf ที่ใหญ่ที่สุดที่นี่
corsiKa

33

ว้าวอะไรในโลก? มันเป็นแค่ฉันหรือว่าคำตอบทั้งหมดเหล่านี้ผิดหรืออย่างน้อยก็ทำให้เข้าใจผิด?

ชั้นบูลีนเป็นเสื้อคลุมรอบประเภทบูลีนดั้งเดิม การใช้ wrapper นี้จะสามารถส่งบูลีนในวิธีที่ยอมรับวัตถุหรือทั่วไป เช่นเวกเตอร์

วัตถุบูลีนไม่สามารถมีค่าเป็นศูนย์ได้ หากการอ้างอิงถึงบูลีนเป็นโมฆะก็หมายความว่าบูลีนของคุณไม่เคยถูกสร้างขึ้น

คุณอาจพบว่ามีประโยชน์: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Boolean.java

การอ้างอิง null บูลีนควรใช้เพื่อกระตุ้นตรรกะที่คล้ายกันซึ่งคุณมีการอ้างอิงโมฆะอื่น ๆ ใช้มันสำหรับตรรกะสามสถานะคือเงอะงะ

แก้ไข: ประกาศว่าBoolean a = true;เป็นข้อความที่ทำให้เข้าใจผิด นี่เท่ากับบางสิ่งที่ใกล้เคียงกับBoolean a = new Boolean(true); โปรดดูการล็อกอัตโนมัติที่นี่: http://en.wikipedia.org/wiki/Boxing_%28computer_science%29#Autoboxing

บางทีนี่อาจเป็นที่มาของความสับสน

แก้ไข 2: โปรดอ่านความคิดเห็นด้านล่าง หากใครมีความคิดว่าจะปรับโครงสร้างคำตอบของฉันเพื่อรวมสิ่งนี้โปรดทำเช่นนั้น


2
ฉันไม่เข้าใจคำสั่งของคุณ "บูลีนไม่สามารถมีค่าเป็นศูนย์" ฉันสามารถสร้าง Boolean ( Boolean a = true;) จากนั้นตั้งค่าเป็น null ( a = null;) มันอาจจะไม่ฉลาดหรือฉลาด แต่เป็นไปได้
peter.murray.rust

7
เมื่อคุณทำBoolean a; a เป็นตัวชี้ไปยังวัตถุบูลีน หากคุณa = null;คุณไม่ได้ตั้งค่าบูลีนเป็นโมฆะคุณได้ตั้งค่าการอ้างอิงเป็นโมฆะ ทำBoolean a = null; a.booleanValue();ในกรณีนี้คุณไม่เคยแม้แต่สร้างวัตถุบูลีนและดังนั้นมันจะโยน nullpointerexception แจ้งให้เราทราบหากคุณต้องการคำแนะนำเพิ่มเติม
606723

ยิ่งไปกว่านั้นเมื่อคุณทำเช่นBoolean a = true;นั้นมันใช้เวทมนตร์บางอย่างที่ตีความได้จริงเพราะนั่นBoolean a = new Boolean(true);อาจไม่ถูกต้องสำหรับเหตุผลด้านประสิทธิภาพ แต่คุณต้องตระหนักว่าบูลีนนั้นยังคงเป็นวัตถุ
user606723

7
@missingno รหัสทั้งหมดที่เกี่ยวข้องกับวัตถุใด ๆ ที่มีการจัดการกับเรื่องนี้ การอ้างอิงวัตถุอาจเป็นโมฆะหรือไม่ก็ได้ นี่ไม่ใช่กรณีพิเศษและไม่ต้องการการพิจารณาเป็นพิเศษ
user606723

3
คุณพลาดจุดของฉัน @missingno ฉันยอมรับว่าเราต้องพิจารณาค่าอ้างอิงที่เป็นโมฆะ ฉันไม่เคยเถียงกับสิ่งนั้น แต่เราต้องทำสิ่งนี้เพื่ออ้างอิงวัตถุใด ๆ การอ้างอิงบูลีน null ไม่ใช่กรณีพิเศษ ดังนั้นค่าอ้างอิงบูลีน null จึงไม่จำเป็นต้องพิจารณาเป็นพิเศษ
user606723

24

มีสามเหตุผลด่วน:

  • เพื่อเป็นตัวแทนของค่าบูลีนฐานข้อมูลซึ่งอาจจะเป็นtrue, falseหรือnull
  • เพื่อแทนxsd:booleanค่าของ XML Schema ที่ประกาศด้วยxsd:nillable="true"
  • เพื่อให้สามารถใช้ประเภททั่วไป: List<Boolean>- คุณไม่สามารถใช้List<boolean>

ฉันเขียน "บูลีน" อย่างชัดเจนไม่ใช่ " boolean" (สไตล์การคิด) เนื่องจากใน Oracle คุณมักจะใช้char(1) nullกับค่า 'T' และ 'F' ดังนั้นจึงอาจ (ด้วยเช่นอะแดปเตอร์ประเภทไฮเบอร์เนต) จะเป็นโมฆะ :)
24499 Grzegorz Grzybek

2
ฐานข้อมูลใดที่ไม่อนุญาตให้มีค่า null สำหรับบูลีน ถ้าคุณตั้งค่าคอลัมน์ที่จะ nullable, ประเภทข้อมูลไม่สำคัญอีกต่อไป ...
คาลบี

@MichalB Sybase (และ SQL Server) ประเภทบิตinfocenter.sybase.com/help/index.jsp?topic=/…
mmmmmm

@ Mark- ไม่ SQL Server อนุญาตบิตที่ไม่สามารถใช้ได้
David M

11

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

  • โมฆะค่า "" ไม่ได้เป็นมูลค่าและเป็นพื้นฐานที่แตกต่างจากและtrue falseมันไม่มีตัวชี้ไปยังวัตถุ ดังนั้นการคิดว่าบูลีนเป็น 3 ค่าจึงเป็นสิ่งที่ผิด
  • ไวยากรณ์สำหรับบูลีนเป็นตัวย่อและปกปิดความจริงที่ว่าการอ้างอิงชี้ไปที่วัตถุ:

    Boolean a = true;

ปกปิดความจริงที่trueเป็นวัตถุ การมอบหมายอื่น ๆ ที่เทียบเท่าอาจเป็น:

Boolean a = Boolean.TRUE;

หรือ

Boolean a = new Boolean(true);
  • ไวยากรณ์ตัวย่อ

    if (a) ...

แตกต่างจากการมอบหมายอื่น ๆ ส่วนใหญ่และปกปิดข้อเท็จจริงที่ว่าอาจเป็นการอ้างอิงวัตถุหรือแบบดั้งเดิม หากวัตถุมีความจำเป็นต้องทดสอบnullเพื่อหลีกเลี่ยง NPE สำหรับฉันมันง่ายกว่าที่จะจำเรื่องนี้ทางจิตวิทยาถ้ามีการทดสอบความเท่าเทียมกัน:

if (a == true) ...

ที่เราอาจได้รับแจ้งให้ทดสอบเป็นโมฆะ ดังนั้นรูปแบบที่สั้นลงจะปลอดภัยเฉพาะเมื่อaเป็นแบบดั้งเดิม

สำหรับตัวเองตอนนี้ฉันมีคำแนะนำ:

  • อย่าใช้ null เป็นตรรกะ 3 ค่า ใช้จริงและเท็จเท่านั้น
  • ไม่กลับมาจากวิธีการที่มันอาจจะBoolean ผลตอบแทนเท่านั้นnullboolean
  • ใช้Booleanสำหรับห่อองค์ประกอบในภาชนะบรรจุเท่านั้นหรือขัดแย้งกับวิธีการที่วัตถุต้องการ

5
อย่าใช้ "บูลีนใหม่ (อะไรก็ตาม)" นั่นจะยกตัวอย่างบูลีนใหม่บนกอง แต่บูลีนนั้นไม่เปลี่ยนรูป ใช้ "Boolean.valueOf (อะไรก็ตาม)" ซึ่งจะสร้างการอ้างอิงซึ่งชี้ไปที่ Boolean.TRUE หรือ Boolean.False ขึ้นอยู่กับสิ่งใด
simbo1905

1
หนึ่งในหลาย ๆ ปัญหาที่เกิดขึ้นกับ Java (IMHO หลังจาก 12 ปี) คือความไม่สอดคล้องกันของวิธีการในการใช้ค่า Null ซึ่งภาษาเก่าก็มีเช่นกัน การดู Scala มันมีแนวคิดของตัวเลือกที่พิมพ์ซึ่งอาจเป็นโมฆะหรือสามารถมีค่า (คลาสย่อยไม่มีหรือบางส่วน) จากนั้นคุณสามารถโทร myOption.getOrElse (defaultValue) ดูที่scala-lang.org/api/current/scala/Option.htmlไม่มีอะไรซับซ้อนเกี่ยวกับคุณลักษณะนี้ แต่เนื่องจากเป็นภาษา JVM ใหม่ที่ห้องสมุดหลายแห่งใช้ นั่นทำให้มาตราส่วน "แก้ไข" บางส่วนของปัญหา "ศตวรรษที่แล้ว" ของ Java แต่ก็ยังคงรวบรวมไฟล์คลาสที่ทำงานบน JRE
simbo1905

10

คลาส Wrapper สำหรับไพรเมอร์สามารถใช้ในกรณีที่จำเป็นต้องใช้วัตถุคอลเลกชันเป็นตัวอย่างที่ดี

ลองนึกภาพคุณต้องด้วยเหตุผลบางอย่างเก็บลำดับของbooleanในArrayListนี้สามารถทำได้โดยการชกมวยในbooleanBoolean

มีคำไม่กี่คำเกี่ยวกับที่นี่

จากเอกสาร:

ดังที่โปรแกรมเมอร์ Java คนใดรู้คุณไม่สามารถใส่ int (หรือค่าดั้งเดิมอื่น ๆ ) ลงในคอลเล็กชันได้ คอลเลกชันสามารถเก็บการอ้างอิงวัตถุเท่านั้นดังนั้นคุณต้องใส่ค่าดั้งเดิมลงในคลาส wrapper ที่เหมาะสม (ซึ่งเป็นจำนวนเต็มในกรณีของ int) เมื่อคุณนำวัตถุออกจากคอลเลกชันคุณจะได้จำนวนเต็มที่คุณใส่เข้าไป หากคุณต้องการ int คุณต้อง unbox Integer โดยใช้วิธีการ intValue ทั้งหมดของมวยและ unboxing นี้เป็นความเจ็บปวดและ clutters รหัสของคุณ คุณสมบัติ autoboxing และ unboxing ทำให้กระบวนการเป็นไปโดยอัตโนมัติขจัดความเจ็บปวดและความยุ่งเหยิง

http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html


3

Booleanเสื้อคลุมจะเป็นประโยชน์เมื่อคุณต้องการไม่ว่าจะเป็นค่าที่ได้รับมอบหมายหรือไม่นอกเหนือจากและtrue falseมีสามสถานะดังนี้:

  • จริง
  • เท็จ
  • ไม่ได้กำหนดไว้ซึ่งก็คือ null

ในขณะที่booleanมีเพียงสองสถานะ:

  • จริง
  • เท็จ

ความแตกต่างดังกล่าวข้างต้นจะทำให้มันเป็นประโยชน์ในรายการของBooleanค่าซึ่งจะมีTrue, หรือFalseNull


ไม่มันไม่มีสถานะเป็นโมฆะนั่นคือข้อมูลอ้างอิง
Matsemann

สิ่งที่ฉันหมายถึงคือ Bolean สามารถใช้สำหรับกำหนดจริง / เท็จและไม่ได้กำหนด
Ramesh PVK

3

ฉันคิดว่าในบางกรณีคุณควรมีกลไกในการแยกแยะเขตข้อมูลบูลีนที่ตั้งค่าไว้แล้วหรือไม่


1

วัตถุประสงค์หลักสำหรับบูลีนคือค่า Null ค่า Null บอกว่าคุณสมบัตินั้นไม่ได้ถูกกำหนดตัวอย่างเช่นใช้คอลัมน์ nullable ฐานข้อมูล

หากคุณต้องการแปลงทุก ๆ ค่าจากบูลีนดั้งเดิมเป็น wrapper Boolean คุณสามารถใช้สิ่งต่อไปนี้เพื่อสนับสนุนโค้ดเก่า:

Boolean set = Boolean.FALSE; //set to default value primitive value (false)
...
if (set) ...

6
'วัตถุประสงค์หลักคือค่า Null' ไม่วัตถุประสงค์หลักของบูลีนคือส่งผ่านการอ้างอิงถึงบูลีนเป็นวัตถุ
user606723

@ user606723 ตกลงฉันหมายถึงกรณีฐานข้อมูลในใจของฉันในขณะที่ฉันกำลังเขียน
JMelnik

1

มีประโยชน์มากมายสำหรับค่า ** null ** ใน wrapper Boolean! :)

ตัวอย่างเช่นคุณอาจมีรูปแบบชื่อ "จดหมายข่าว" ที่ระบุว่าผู้ใช้ต้องการหรือไม่ต้องการรับจดหมายข่าวจากเว็บไซต์ของคุณ หากผู้ใช้ไม่ได้เลือกค่าในฟิลด์นี้คุณอาจต้องการใช้พฤติกรรมเริ่มต้นกับสถานการณ์นั้น (ส่ง? ไม่ส่ง? คำถามอีกครั้งหรือไม่ ฯลฯ ) เห็นได้ชัดว่าไม่ได้ตั้งค่า (หรือไม่ได้เลือกหรือเป็นโมฆะ **) ซึ่งไม่เหมือนจริงหรือเท็จ

แต่ถ้า "ไม่ได้ตั้งค่า" ใช้ไม่ได้กับโมเดลของคุณอย่าเปลี่ยนบูลีนดั้งเดิม)


1

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

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

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

แค่ 2 เซ็นต์ของฉัน


1

สำหรับคำตอบที่ดีข้างต้นฉันจะยกตัวอย่างที่เป็นรูปธรรมในHttpSessionคลาสservlet Java หวังว่าตัวอย่างนี้ช่วยชี้แจงคำถามที่คุณอาจยังมีอยู่

หากคุณต้องการจัดเก็บและดึงค่าสำหรับเซสชันคุณใช้วิธีsetAttribute(String, Object) และgetAttribute(String, Object) ดังนั้นสำหรับค่าบูลีนคุณจำเป็นต้องใช้คลาสบูลีนหากคุณต้องการเก็บไว้ในเซสชัน http

HttpSession sess = request.getSession(false);
Boolean isAdmin = (Boolean) sess.getAttribute("admin");
if (! isAdmin) ...

บรรทัดสุดท้ายจะทำให้ a NullPointerExceptionหากไม่มีการตั้งค่าแอตทริบิวต์ (ซึ่งเป็นสาเหตุทำให้ฉันโพสต์นี้) ดังนั้นสถานะของลอจิก 3 จึงอยู่ที่นี่ไม่ว่าคุณจะใช้มันหรือไม่ก็ตาม


0

วิธีที่ดีที่สุดคือหลีกเลี่ยงบูลีนอย่างสมบูรณ์เนื่องจากบูลีนทุกอันแสดงว่าคุณมีคำสั่งแบบมีเงื่อนไขทุกที่ในรหัสของคุณ (ดูที่http://www.antiifcampaign.com/และคำถามนี้: คุณสามารถเขียนอัลกอริทึมใด ๆ โดยไม่มีคำสั่ง if ? )

อย่างไรก็ตามในทางปฏิบัติคุณต้องใช้บูลีนเป็นครั้งคราว แต่ตามที่คุณได้ค้นพบด้วยตัวเองแล้วการจัดการกับบูลีนนั้นมีข้อผิดพลาดได้ง่ายกว่าและยุ่งยากกว่า ดังนั้นฉันขอแนะนำให้ใช้บูลีนทุกที่ที่เป็นไปได้ ข้อยกเว้นจากสิ่งนี้อาจเป็นฐานข้อมูลดั้งเดิมที่มีคอลัมน์บูลีน nullable แม้ว่าฉันจะพยายามซ่อนไว้ในการทำแผนที่ของฉันเช่นกัน


การจัดการกับ Booleans นั้นเกิดข้อผิดพลาดได้ง่ายเหมือนกับการจัดการกับ Object อื่น ๆ BTW ลิงก์นี้ไม่สนับสนุนการเพิ่มจำนวนของ IF สำหรับการตรวจสอบประเภทไม่ใช่เพื่อการใช้งานทั่วไป และในทางกลับกันนั่นเป็น "อันตราย" เพราะทำให้การแก้ไขยากขึ้น ดังนั้นจึงไม่มีอะไรผิดปกติกับ IFs ต่อ se
นายสมิ ธ

ไม่ใช่คำตอบสำหรับคำถาม
Matsemann

@MisterSmith Imho ค่าสถานะบูลีนมักถูกนำไปใช้ในทางที่ผิดเช่นตัวแปรการตรวจสอบประเภทดังนั้นลิงก์สามารถใช้ที่นี่ได้เช่นกัน มันควรจะเป็นคำใบ้ที่ควรคิดว่าบูลีนเป็นเครื่องมือที่เหมาะสมในสถานการณ์ที่แน่นอนหรือไม่ คำว่า "หลีกเลี่ยงบูลีนอย่างสมบูรณ์" เป็นหลักสูตรที่รุนแรงมากและเป็นไปไม่ได้ในทางปฏิบัติทำไมฉันถึงเพิ่มย่อหน้าที่สอง ฉันยังได้เพิ่ม "ข้อผิดพลาดมากขึ้นได้ง่ายขึ้นและยุ่งยากมากขึ้น" เพื่อชี้แจงสิ่งต่าง ๆ
Roland Schneider

0

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


2
จะไม่ enums จะดีที่สุดสำหรับเรื่องนี้? ซึ่งแตกต่างจาก NullPointerExceptions ที่คาดไม่ถึงสำหรับลูกค้า, enums จะกำหนด "รัฐ" อย่างชัดเจน
Kartik Chugh

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