คำถามติดแท็ก static-methods

วิธีการที่ไม่ต้องใช้อินสแตนซ์ของคลาสและไม่สามารถเข้าถึงข้อมูลโดยปริยาย (หรือสิ่งนี้ตัวเองฉัน ฯลฯ ) ของอินสแตนซ์ดังกล่าว


21
Java: เมื่อใดจะใช้วิธีการคงที่
ฉันสงสัยว่าจะใช้วิธีการคงที่เมื่อใด พูดถ้าฉันมีคลาสที่มี getters และ setters ไม่กี่วิธีหรือสองและฉันต้องการวิธีเหล่านั้นเท่านั้นที่จะสามารถเรียกใช้บนวัตถุตัวอย่างของชั้นเรียน นี่หมายความว่าฉันควรใช้วิธีการคงที่หรือไม่? เช่น Obj x = new Obj(); x.someMethod หรือ Obj.someMethod (นี่เป็นวิธีที่คงที่หรือไม่) ฉันค่อนข้างสับสน!



24
ทำไมฉันไม่สามารถกำหนดวิธีการคงที่ในส่วนต่อประสาน Java?
แก้ไข: ในฐานะของ Java 8 ตอนนี้วิธีการคงที่ได้รับอนุญาตในส่วนต่อประสาน นี่คือตัวอย่าง: public interface IXMLizable<T> { static T newInstanceFromXML(Element e); Element toXMLElement(); } แน่นอนว่ามันจะไม่ทำงาน แต่ทำไมล่ะ หนึ่งในปัญหาที่เป็นไปได้คือสิ่งที่เกิดขึ้นเมื่อคุณโทร: IXMLizable.newInstanceFromXML(e); ในกรณีนี้ฉันคิดว่ามันควรจะเรียกวิธีการที่ว่างเปล่า (เช่น {}) คลาสย่อยทั้งหมดจะถูกบังคับให้ใช้เมธอดสแตติกดังนั้นพวกมันทั้งหมดจึงใช้ได้เมื่อเรียกเมธอดสแตติก เหตุใดจึงเป็นไปไม่ได้ แก้ไข:ฉันเดาว่าฉันกำลังมองหาคำตอบที่ลึกกว่า "เพราะนั่นคือวิธีที่ Java เป็น" มีเหตุผลทางเทคโนโลยีเฉพาะหรือไม่ทำไมวิธีการแบบคงที่ไม่สามารถเขียนทับได้? นั่นคือเหตุผลที่นักออกแบบของ Java ตัดสินใจที่จะทำให้วิธีการเช่นการแทนที่ แต่ไม่ใช่วิธีการคงที่? แก้ไข:ปัญหาเกี่ยวกับการออกแบบของฉันคือฉันกำลังพยายามใช้อินเทอร์เฟซเพื่อบังคับใช้แบบแผนการเข้ารหัส นั่นคือเป้าหมายของอินเทอร์เฟซคือสองเท่า: ฉันต้องการอินเทอร์เฟซ IXMLizable เพื่อให้ฉันสามารถแปลงคลาสที่นำไปใช้กับองค์ประกอบ XML (โดยใช้ polymorphism ทำงานได้ดี) ถ้ามีคนต้องการสร้างอินสแตนซ์ใหม่ของคลาสที่ใช้อินเทอร์เฟซ IXMLizable พวกเขาจะรู้อยู่เสมอว่าจะมีตัวสร้างแบบคงที่ newInstanceFromXML (องค์ประกอบ e) …

14
วิธีการสามารถทำให้คงที่ แต่ควร?
Resharper ชอบที่จะชี้ให้เห็นถึงฟังก์ชั่นหลาย ๆ ต่อหน้า asp.net ที่สามารถทำให้คงที่ มันช่วยฉันได้ไหมถ้าฉันทำให้มันคงที่? ฉันควรทำให้พวกเขาคงที่และย้ายไปยังคลาสยูทิลิตี้?

9
วิธีการเรียกใช้ getClass () จากวิธีการคงที่ใน Java?
ฉันมีคลาสที่ต้องมีวิธีการคงที่ ภายในวิธีการคงที่เหล่านี้ฉันต้องเรียกวิธี getClass () เพื่อโทรออกดังต่อไปนี้: public static void startMusic() { URL songPath = getClass().getClassLoader().getResource("background.midi"); } อย่างไรก็ตาม Eclipse บอกฉัน: Cannot make a static reference to the non-static method getClass() from the type Object วิธีที่เหมาะสมในการแก้ไขข้อผิดพลาดในเวลารวบรวมนี้คืออะไร?

7
ฟังก์ชั่น Namespace + กับวิธีการคงที่ในชั้นเรียน
สมมติว่าฉันมีหรือกำลังจะเขียนชุดของฟังก์ชั่นที่เกี่ยวข้อง สมมติว่าพวกเขาเกี่ยวข้องกับคณิตศาสตร์ ฉันควร: เขียนฟังก์ชั่นเหล่านี้และใส่ไว้ในMyMathเนมสเปซของฉันและอ้างอิงผ่านMyMath::XYZ() สร้างชั้นเรียนที่เรียกว่าMyMathและทำให้วิธีการเหล่านี้คงที่และอ้างถึงในทำนองเดียวกันMyMath::XYZ() เหตุใดฉันจึงเลือกหนึ่งรายการเพื่อจัดระเบียบซอฟต์แวร์ของฉัน

21
วิธีการช่วยเหลือส่วนตัวควรจะคงที่หากพวกเขาสามารถคงที่
สมมติว่าฉันมีคลาสที่ออกแบบมาให้เป็นอินสแตนซ์ ฉันมีวิธีการ "ผู้ช่วย" ส่วนตัวหลายอย่างในชั้นเรียนที่ไม่ต้องการการเข้าถึงสมาชิกของชั้นเรียนใด ๆ และดำเนินการกับข้อโต้แย้งของพวกเขา แต่เพียงผู้เดียวและส่งกลับผลลัพธ์ public class Example { private Something member; public double compute() { double total = 0; total += computeOne(member); total += computeMore(member); return total; } private double computeOne(Something arg) { ... } private double computeMore(Something arg) {... } } มีเหตุผลใดที่ต้องระบุcomputeOneและใช้computeMoreเป็นวิธีการคงที่ - หรือเหตุผลเฉพาะใด ๆ ที่จะไม่ทำ? …

11
วิธีการคงที่ในชั้นเรียนทั่วไป?
ใน Java ฉันต้องการมีสิ่งต่อไปนี้: class Clazz<T> { static void doIt(T object) { // ... } } แต่ฉันได้ ไม่สามารถทำการอ้างอิงแบบคงที่กับประเภทที่ไม่ใช่แบบคงที่ T ฉันไม่เข้าใจข้อมูลทั่วไปนอกเหนือจากการใช้งานพื้นฐานดังนั้นจึงไม่สามารถเข้าใจได้ มันไม่ได้ช่วยให้ฉันไม่สามารถหาข้อมูลจำนวนมากบนอินเทอร์เน็ตเกี่ยวกับเรื่องนี้ บางคนสามารถอธิบายได้ว่าการใช้ดังกล่าวเป็นไปได้ด้วยวิธีเดียวกันหรือไม่? ทำไมความพยายามเริ่มแรกของฉันถึงไม่สำเร็จ?

15
ใช้คลาสเดี่ยวด้วยวิธีที่ดีที่สุด?
สมมติว่าฉันมีคลาสที่ตั้งใจจะทำหน้าที่เดียว หลังจากดำเนินการฟังก์ชั่นมันสามารถถูกทำลาย มีเหตุผลใดที่จะชอบแนวทางเหล่านี้หรือไม่? // Initialize arguments in constructor MyClass myObject = new MyClass(arg1, arg2, arg3); myObject.myMethod(); // Pass arguments to method MyClass myObject = new MyClass(); myObject.myMethod(arg1, arg2, arg3); // Pass arguments to static method MyClass.myMethod(arg1, arg2, arg3); ฉันถูกคลุมเครือโดยเจตนาเกี่ยวกับรายละเอียดพยายามหาแนวทางสำหรับสถานการณ์ที่แตกต่างกัน แต่ฉันไม่ได้นึกถึงฟังก์ชั่นห้องสมุดง่ายๆอย่าง Math.random () ฉันกำลังคิดว่าจะมีคลาสที่ทำงานเฉพาะอย่างซับซ้อนบางอย่าง แต่ต้องการเพียงหนึ่งวิธี (สาธารณะ) เท่านั้นที่จะทำได้
172 c#  java  oop  static-methods 

5
การเรียกคลาสคงที่วิธีการภายในร่างกายของชั้นเรียน?
เมื่อฉันพยายามที่จะใช้วิธีการคงที่จากภายในร่างกายของชั้นเรียนและกำหนดวิธีการคงที่โดยใช้staticmethodฟังก์ชั่นในตัวเป็นมัณฑนากรเช่นนี้: class Klass(object): @staticmethod # use as decorator def _stat_func(): return 42 _ANS = _stat_func() # call the staticmethod def method(self): ret = Klass._stat_func() + Klass._ANS return ret ฉันได้รับข้อผิดพลาดต่อไปนี้: Traceback (most recent call last):<br> File "call_staticmethod.py", line 1, in <module> class Klass(object): File "call_staticmethod.py", line 7, in Klass _ANS = …

7
วิธีการขยายแบบคงที่ใน Kotlin
คุณกำหนดวิธีการขยายแบบคงที่ใน Kotlin ได้อย่างไร? เป็นไปได้หรือไม่? ขณะนี้ฉันมีวิธีการขยายดังที่แสดงด้านล่าง public fun Uber.doMagic(context: Context) { // ... } ส่วนขยายข้างต้นสามารถเรียกใช้ในอินสแตนซ์ได้ uberInstance.doMagic(context) // Instance method แต่ฉันจะทำให้มันเป็นวิธีการคงที่ดังที่แสดงด้านล่างได้อย่างไร Uber.doMagic(context) // Static or class method

9
เหตุใดวิธีการคงที่จึงถือว่าเป็นวิธีการ
ฉันกำลังเขียนคำอธิบายรหัสสำหรับหลักสูตรและบังเอิญใช้คำmethodและfunctionสลับกันไปมา ฉันตัดสินใจที่จะกลับไปแก้ไขคำพูดนั้น แต่ก็พบกับช่องโหว่ในความเข้าใจของฉัน จากสิ่งที่ฉันเข้าใจรูทีนย่อยคือfunctionถ้ามันไม่ทำงานกับอินสแตนซ์ของคลาส (เอฟเฟกต์ถูก จำกัด ไว้ที่อินพุต / เอาท์พุตอย่างชัดเจน) และmethodถ้ามันทำงานบนอินสแตนซ์ของคลาส (มันอาจมี ออกผลข้างเคียงในกรณีที่ทำให้ไม่บริสุทธิ์) มีการอภิปรายที่ดีในหัวข้อนี้ โปรดทราบว่าตามคำจำกัดความของคำตอบที่ยอมรับแล้วสแตติกmethodควรเป็นฟังก์ชันเนื่องจากอินสแตนซ์จะไม่ถูกส่งผ่านโดยปริยายและไม่มีการเข้าถึงสมาชิกของอินสแตนซ์ใด ๆ ด้วยเหตุนี้จึงไม่ควรนิ่งmethodsเป็นฟังก์ชันใช่หรือไม่? ตามความหมายของพวกเขาพวกเขาไม่ได้ดำเนินการกับกรณีเฉพาะของคลาส พวกเขา "ผูก" กับชั้นเรียนเพราะความสัมพันธ์เท่านั้น ฉันเคยเห็นไซต์ที่ดูดีสองสามแห่งที่อ้างถึงรูทีนย่อยแบบคงที่เป็น "วิธีการ" แม้ว่า ( Oracle , Fredosaurus , ProgrammingSimplified ) ดังนั้นพวกเขาทั้งหมดมองข้ามคำศัพท์หรือฉันพลาดอะไรบางอย่าง (ฉันเดาว่าเป็นอย่างหลัง) . ฉันต้องการให้แน่ใจว่าฉันใช้ถ้อยคำที่ถูกต้อง ใครช่วยเคลียร์เรื่องนี้ได้ไหม

2
พฤติกรรมวิธีคงที่ในสภาพแวดล้อมแบบมัลติเธรดใน java
มีคำถามโง่ ๆ ง่ายๆที่กวนใจฉันและมีข้อโต้แย้งมากมายในใจ ฉันต้องการคลายข้อสงสัยทั้งหมดเกี่ยวกับคำถามด้านล่างนี้ class Clstest{ public static String testStaticMethod(String inFileStr) { // section 0 // section 1 // do something with inFileStr // section 2 // section 3 return inFileStr; } } สมมติว่ามีเธรดห้าเธรดที่เรียกใช้งานClstest.testStaticMethod("arg-n")ในเวลาเดียวกัน Clstest.testStaticMethod("arg-1")ด้ายสาย 1 เมื่อด้ายที่ 1 คือในส่วนที่ 1, 2 Clstest.testStaticMethod("arg-2")ด้ายสาย แล้วเธรด 1 จะเกิดอะไรขึ้น? จะเข้าสู่สภาวะหลับใหล? เมื่อเธรด 1 มีโอกาสจะกลับมาดำเนินการต่อจากส่วนที่ 1 …

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