การเขียนโปรแกรม

คำถาม & คำตอบสำหรับโปรแกรมเมอร์มืออาชีพและกระตือรือร้น


7
เมธอดมีการลบแบบเดียวกับเมธอดชนิดอื่น
ทำไมมันไม่ถูกกฎหมายที่จะมีสองวิธีต่อไปนี้ในชั้นเรียนเดียวกัน class Test{ void add(Set<Integer> ii){} void add(Set<String> ss){} } ฉันได้รับ compilation error วิธีการเพิ่ม (ชุด) มีการเพิ่มการลบเช่นเดียวกับชุดวิธีการอื่นในการทดสอบประเภท ในขณะที่ฉันสามารถหลีกเลี่ยงได้ฉันก็สงสัยว่าทำไม javac ไม่ชอบสิ่งนี้ ฉันเห็นได้ว่าในหลาย ๆ กรณีตรรกะของทั้งสองวิธีนั้นจะคล้ายกันมากและอาจถูกแทนที่ด้วยวิธีเดียว public void add(Set<?> set){} วิธีการ แต่นี่ไม่ใช่กรณี นี่เป็นเรื่องที่น่ารำคาญเป็นพิเศษหากคุณต้องการมีสองอันconstructorsที่ขัดแย้งกันเพราะคุณไม่สามารถเปลี่ยนชื่อของหนึ่งในconstructorsนั้นได้
381 java  generics 

22
หลีกเลี่ยงการซิงโครไนซ์ (นี่) ใน Java หรือไม่
เมื่อใดก็ตามที่มีคำถามปรากฏขึ้นบน SO เกี่ยวกับการซิงโครไนซ์ Java บางคนมีความกระตือรือร้นที่จะชี้ให้เห็นว่าsynchronized(this)ควรหลีกเลี่ยง แต่พวกเขาอ้างว่าต้องการล็อคตัวอ้างอิงส่วนตัวแทน เหตุผลบางประการที่กำหนดคือ: รหัสความชั่วร้ายบางอย่างอาจขโมยล็อคของคุณ (เป็นที่นิยมมากรหัสนี้มีตัวแปร "โดยไม่ตั้งใจ") วิธีการทำข้อมูลให้ตรงกันทั้งหมดภายในชั้นเดียวกันใช้ล็อคเดียวกันแน่นอนซึ่งช่วยลดปริมาณงาน คุณกำลังเปิดเผยข้อมูลมากเกินไปโดยไม่จำเป็น คนอื่นรวมถึงฉันเถียงว่าsynchronized(this)เป็นสำนวนที่ใช้บ่อยๆ (เช่นในห้องสมุด Java) มีความปลอดภัยและเข้าใจดี ไม่ควรหลีกเลี่ยงเพราะคุณมีข้อผิดพลาดและคุณไม่รู้ว่าเกิดอะไรขึ้นในโปรแกรมแบบมัลติเธรดของคุณ กล่าวอีกนัยหนึ่ง: ถ้ามันใช้ได้แล้วใช้มัน ฉันสนใจที่จะเห็นตัวอย่างในโลกแห่งความเป็นจริง (ไม่มีสิ่งใดสำหรับ foobar) ที่หลีกเลี่ยงการล็อกบนthisจะดีกว่าเมื่อsynchronized(this)จะทำงาน ดังนั้น: คุณควรหลีกเลี่ยงsynchronized(this)และแทนที่ด้วยล็อคในการอ้างอิงส่วนตัวหรือไม่? ข้อมูลเพิ่มเติมบางส่วน (อัปเดตเมื่อได้รับคำตอบแล้ว): เรากำลังพูดถึงการประสานอินสแตนซ์ ทั้งโดยนัย ( synchronizedวิธีการ) และรูปแบบที่ชัดเจนในการsynchronized(this)ได้รับการพิจารณา หากคุณอ้างถึง Bloch หรือหน่วยงานอื่น ๆ ในเรื่องนี้อย่าปล่อยชิ้นส่วนที่คุณไม่ชอบ (เช่น Java ที่มีประสิทธิภาพ, รายการเกี่ยวกับความปลอดภัยของกระทู้: โดยปกติแล้วมันจะล็อคตัวอินสแตนซ์เอง แต่มีข้อยกเว้น) หากคุณต้องการความละเอียดในการล็อคอื่น ๆ นอกเหนือจากข้อsynchronized(this)เสนอsynchronized(this)มันจะไม่สามารถใช้ได้ดังนั้นจึงไม่ใช่ปัญหา

16
ควรใช้การอ้างอิงกับพอยน์เตอร์เมื่อใด
ฉันเข้าใจไวยากรณ์และความหมายทั่วไปของพอยน์เตอร์กับการอ้างอิง แต่ฉันจะตัดสินใจได้อย่างไรว่าควรจะใช้การอ้างอิงหรือพอยน์เตอร์ใน API เหมาะสมกว่าหรือน้อยกว่านั้น โดยปกติแล้วบางสถานการณ์ต้องการหนึ่งหรืออื่น ๆ ( operator++ต้องการอาร์กิวเมนต์อ้างอิง) แต่โดยทั่วไปฉันพบว่าฉันชอบที่จะใช้พอยน์เตอร์ (และพอยน์เตอร์พอยน์) เนื่องจากไวยากรณ์มีความชัดเจนว่าตัวแปรนั้นผ่านการทำลายล้าง เช่นในรหัสต่อไปนี้: void add_one(int& n) { n += 1; } void add_one(int* const n) { *n += 1; } int main() { int a = 0; add_one(a); // Not clear that a may be modified add_one(&a); // 'a' is clearly …
381 c++  pointers  reference 

14
วิธีการค้นหาจำนวน * ลอจิก * แกนบน Mac OS X
คุณจะบอกได้อย่างไรจากบรรทัดคำสั่งว่ามีคอร์จำนวนเท่าใดบนเครื่องเมื่อคุณใช้ Mac OS X บน Linux ฉันใช้: x=$(awk '/^processor/ {++n} END {print n+1}' /proc/cpuinfo) มันไม่สมบูรณ์แบบ แต่ใกล้กัน นี่มีวัตถุประสงค์เพื่อให้ได้รับการป้อนmakeซึ่งเป็นสาเหตุที่ทำให้ได้ผลลัพธ์ 1 สูงกว่าจำนวนที่แท้จริง และฉันรู้ว่าโค้ดข้างต้นสามารถเขียนได้หนาแน่นขึ้นใน Perl หรือสามารถเขียนได้โดยใช้ grep, wc และ cut แต่ฉันตัดสินใจว่าข้างต้นเป็นข้อตกลงที่ดีระหว่างความกระชับและความสามารถในการอ่าน แก้ไข LATE มากเพียงเพื่อชี้แจง: ฉันถามจำนวนแกนตรรกะที่มีอยู่เพราะสิ่งนี้สอดคล้องกับงานพร้อมกันจำนวนมากที่ฉันต้องการmakeวางไข่ คำตอบ JKP ของการกลั่นต่อไปโดยคริสลอยด์เป็นว่าสิ่งที่ฉันต้องการ YMMV
381 macos  makefile 

14
iPhone ซ่อนแถบนำทางในหน้าแรกเท่านั้น
ฉันมีรหัสด้านล่างที่ซ่อนและแสดงแถบการนำทาง มันถูกซ่อนไว้เมื่อมุมมองแรกโหลดแล้วซ่อนเมื่อเรียกว่า "children" ปัญหาคือฉันไม่สามารถหากิจกรรม / การกระทำที่จะเรียกให้ซ่อนอีกครั้งเมื่อพวกเขากลับไปที่มุมมองรูต .... ฉันมีปุ่ม "ทดสอบ" บนหน้ารูทที่ดำเนินการด้วยตนเอง แต่มันไม่สวยและฉันต้องการให้มันเป็นแบบอัตโนมัติ -(void)hideBar { self.navController.navigationBarHidden = YES; } -(void)showBar { self.navController.navigationBarHidden = NO; }

25
วิธีการรอให้เธรดทั้งหมดเสร็จสิ้นโดยใช้ ExecutorService
ฉันต้องทำงานบางอย่างทีละ 4 อย่างเช่นนี้: ExecutorService taskExecutor = Executors.newFixedThreadPool(4); while(...) { taskExecutor.execute(new MyTask()); } //...wait for completion somehow ฉันจะได้รับการแจ้งเตือนได้อย่างไรเมื่อทั้งหมดเสร็จสมบูรณ์ สำหรับตอนนี้ฉันไม่สามารถคิดอะไรได้ดีไปกว่าการตั้งตัวนับโกลบอลบางตัวและลดมันลงที่ส่วนท้ายของทุกภารกิจ หรือรับรายการ Futures และใน infinite loop monitor isDone สำหรับพวกเขาทั้งหมด อะไรคือวิธีแก้ปัญหาที่ดีกว่าที่ไม่เกี่ยวข้องกับการวนซ้ำไม่สิ้นสุด? ขอบคุณ

15
รับรายการฐานข้อมูลจาก SQL Server
ฉันจะรับรายการฐานข้อมูลที่มีอยู่บนอินสแตนซ์ของ SQL Server ได้อย่างไร ฉันวางแผนที่จะทำรายการของพวกเขาในกล่องคำสั่งผสมใน VB.NET
381 sql-server 

5
จัดรูปแบบสตริง Go โดยไม่พิมพ์หรือไม่
มีวิธีง่ายๆในการจัดรูปแบบสตริงใน Go โดยไม่ต้องพิมพ์สตริงหรือไม่? ที่ฉันสามารถทำได้: bar := "bar" fmt.Printf("foo: %s", bar) แต่ฉันต้องการสตริงที่ฟอร์แมทที่ส่งคืนแทนที่จะพิมพ์เพื่อให้ฉันสามารถจัดการกับมันต่อไป ฉันสามารถทำสิ่งที่ชอบ: s := "foo: " + bar แต่สิ่งนี้กลายเป็นเรื่องยากที่จะอ่านเมื่อสตริงรูปแบบซับซ้อนและยุ่งยากเมื่อส่วนหนึ่งหรือหลายส่วนไม่ใช่สตริงและต้องถูกแปลงก่อนเช่น i := 25 s := "foo: " + strconv.Itoa(i) มีวิธีที่ง่ายกว่านี้หรือไม่?


5
SQL Server Profiler - วิธีกรองการติดตามเพื่อแสดงเหตุการณ์จากฐานข้อมูลเดียวเท่านั้น
ฉันจะ จำกัด การติดตาม SQL Server Profiler เป็นฐานข้อมูลเฉพาะได้อย่างไร ฉันไม่เห็นวิธีกรองการติดตามเพื่อไม่เห็นเหตุการณ์สำหรับฐานข้อมูลทั้งหมดในอินสแตนซ์ที่ฉันเชื่อมต่อ

13
การใช้วิธีจบ / กำจัดใน C #
C # 2008 ฉันทำงานนี้มาระยะหนึ่งแล้วและฉันยังสับสนเกี่ยวกับการใช้ขั้นตอนสุดท้ายและการกำจัดในโค้ด คำถามของฉันอยู่ด้านล่าง: ฉันรู้ว่าเราต้องการเครื่องมือขั้นสุดท้ายขณะที่ทิ้งทรัพยากรที่ไม่มีการจัดการ อย่างไรก็ตามหากมีการจัดการทรัพยากรที่โทรไปยังทรัพยากรที่ไม่มีการจัดการมันจะยังคงต้องใช้ตัวเลือกสุดท้าย อย่างไรก็ตามหากฉันพัฒนาคลาสที่ไม่ได้ใช้ทรัพยากรที่ไม่มีการจัดการไม่ว่าทางตรงหรือทางอ้อมฉันควรใช้IDisposableเพื่ออนุญาตให้ลูกค้าของคลาสนั้นใช้ 'การใช้คำสั่ง' หรือไม่ เป็นไปได้ไหมที่จะใช้ IDisposable เพียงเพื่อให้ลูกค้าในชั้นเรียนของคุณใช้คำสั่ง use using(myClass objClass = new myClass()) { // Do stuff here } ฉันได้พัฒนาโค้ดง่าย ๆ ด้านล่างนี้เพื่อสาธิตการใช้งานสุดท้าย / กำจัดทิ้ง: public class NoGateway : IDisposable { private WebClient wc = null; public NoGateway() { wc = new WebClient(); wc.DownloadStringCompleted += …

8
รับแฮชเวอร์ชัน Git สั้น ๆ
มีวิธีที่สะอาดกว่าในการรับแฮชรุ่นสั้น ๆHEADจาก Git หรือไม่? ฉันต้องการที่จะเห็นผลลัพธ์เดียวกันกับที่ฉันได้รับจาก: git log -n 1 | head -n 1 | sed -e 's/^commit //' | head -c 8 ฉันใช้คำสั่งข้างต้นเพื่อสร้างสตริงรุ่น แต่สิ่งนี้ดียิ่งขึ้น: git describe --tags มันจะออกสายเช่น0.1.12(แท็กกระทำกระทำ) หรือ0.1.11-5-g0c85fbc(ห้ากระทำหลังจากแท็ก)
381 git 


21
มีวิธีการตรวจสอบทั้ง "โมฆะ" และ "ไม่ได้กำหนด" หรือไม่?
เนื่องจาก TypeScript ถูกพิมพ์อย่างรุนแรงเพียงใช้if () {}เพื่อตรวจสอบnullและundefinedฟังดูไม่ถูกต้อง TypeScript มีฟังก์ชั่นเฉพาะหรือไวยากรณ์สำหรับเรื่องนี้หรือไม่?

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