سؤال

بالإضافة إلى بالطبع، استخدامها مع البدائيات. معظم (إن لم يكن جميعا) من التطبيقات التي أراها مفيدة فقط من وجهة نظر مبرمجة.


تعديل: أنا أفهم أنني من المفترض أن أتجاوز السلوك الافتراضي، ولهذا السبب ذكرت التطبيقات :). وأحصل على قيمة الغالبة في بعض المكونات التي تتطلب تمثيل سلسلة داخل واجهة المستخدم الرسومية. ومع ذلك، في JDK على الأقل، أرى الكثير من التطبيقات التي تأتي فقط لاستخدامها كلما احتجت إلى تصحيح مثيلات الكائنات.

لماذا يتم تشغيله في فئة الكائنات، لأن هذا يبدو مفيدا فقط لأشياء GUI / Debugging؟ هل هناك استخدامات أخرى أنا لست على علم؟

هل كانت مفيدة؟

المحلول

Tostring () مفيد كلما أردت تمثيل سلسلة كائن. بطبيعة الحال التي تحدث لأغراض تصحيح الأخطاء، ولكن يمكن أيضا أن تكون صالحة لإخراج نتائج العمليات للمستخدم.

على سبيل المثال، دعنا نقول أن لديك فئة معقدة تعامل مع أرقام معقدة. إذا كنت ترغب في طباعةها إلى مستخدم بتنسيق مثل 3 + 2i., ، من المفيد إذا حددوا Tostring () لأنك لا تضطر إلى كتابة التنسيق في كل مرة، وسوف يكون الإخراج متسقا. إذا كنت ترغب في تغيير هذا التمثيل، على سبيل المثال ل 3 + 2J., ، تحتاج فقط إلى لمس طريقة ToString () في الفئة المعقدة.

لذلك ToString () ليست لأغراض تصحيح الأخطاء أيضا، ولكنها طريقة جيدة للحصول على تمثيلات سلسلة متسقة لكائناتك.

نصائح أخرى

لا، المفتاح هو أنك من المفترض أن تتجاوز التنفيذ الافتراضي لل ToString() لجعلها مفيدة. ToString() يمكن أن تكون طريقة رائعة لإخراج قيمة شيء عودة إلى UI.

سيكون مثالا بسيطا إذا كان لديك فئة اسم بها سلاسل ثلاثية (أولا، وسط، أخيرا). يمكنك الحصول على ToString() الطريقة التي تنسقها ل UI: "آخر، أول منتصف" على سبيل المثال.

أو فئة تخزن عملية رياضية (القيم اليسار = 2، اليمين = 3، النتيجة = 6 ومشغل enum = اضرب). يتصل ToString() للحصول على "2 * 3 = 6".

ومع ذلك, ، ربما يكون أكثر شيوعا أن يكون لديك مجموعة متنوعة مختلفة To<qualifier>String() طرق، مثل .NET DateTime صف دراسي. فيToShortDateString(), ToLongDateString(), ToLongTimeString(), ...)

تحرير: أما لماذا الجذور في Object فئة، انها ببساطة ل ToString() هي عملية صالحة ل اي شى.

بالإضافة إلى ذلك، يمكن أن تكون السلاسل طريقة جيدة للتنظيم بين أنواع البيانات أو مستهلكي البيانات، لأنها (عمليا) مضمونة لتكون parsable ولا تتطلب ترميز إضافي أو رعاية.

تفضيلاتي الشخصية هي أن ToString () يجب أبدا أن تستخدم لأي شيء آخر غير تصحيح الأخطاء. إذا كنت ترغب في إنتاج سلسلة للحصول على كائن، فقم بتوفير طريقة منفصلة تنثث بوضوح نيتنتك (GetName ()، GetDescription ()، إلخ). لا تعتمد أبدا على تنفيذ ToString ().

المشكلة هي أن العديد من المطورين يرون tostring () كسلسلة على مستوى التصحيح والتفكير في شيء من تغييره (يقول عند إضافة الحقول الجديدة أو إزالتها). هيك، بعض البنائين الآلي () يستخدمون انعكاس لإنشاء ToString () من الحقول.

لقد وجدت أن هذا التفضيل قد خدمني على مر السنين.

كل ما يمكنني قوله هو أن لدي كسر رمز عندما غيرت ToString من صفي لعرض بعض معلومات التصحيح الإضافية.

كان الرمز المعني في السؤال مكتبة واجهة المستخدم الرسومية التي قررت استخدام قيمة Tostring كأشياء داخلية (كانت قبل بضع سنوات ... أنسى ما كان بالضبط). وكانت النتيجة النهائية أنني لم أستخدم تلك المكتبة بعد الآن.

أود أن أقول أنه نظرا لأن مجموعة كبيرة من الأشخاص يرون الشغب في استخدامها في تصحيح الأخطاء (بغض النظر عن رأيك في ما تعتقد أنه يجب استخدامه) أنه يمثل مشكلة للاستفادة من القيمة التي تم إرجاعها من خلال القيام بأي شيء برمجي (مثل تحليلها) أو عرضها للمستخدم.

إذا كنت 100٪ في السيطرة على طرق ToString، فكل الوسائل تفعل ما تريد.

لذلك، للإجابة على السؤال، لا يوجد شاغرة ليست مفيدة فقط لتصحيح الأخطاء، يمكنك أن تفعل أي شيء تريده به. ومع ذلك، لا تفاجأ ما إذا كان Tostring يتغير بطرق تجعلك غير راض.

في تجربتي، يكون Tostring () قيمة ضئيلة خارج تصحيح الأخطاء وتسجيلها. لا يمكنك الاعتماد على تنسيقها أو محتوياتها مع مرور الوقت، بحيث لا تعتمد على أنه مقروء بشري، لا تعتمد على أي شيء آخر غير أبسط الكائنات (مثل أنواع الكائنات البدائية). إذا كان هناك أعضاء بيانات متعددة، فنتوقع أن يتغيروا في النوع أو الرقم مع مرور الوقت، وإخراج Tostring () جنبا إلى جنب معها.

نقطة أخرى أود أن أجري بقوة. لا تتصل بطرق أخرى في Tostring (). لا شيء أسوأ من التحقق من المحتويات المتغيرة على نقطة توقف في المصحح، ثم امتلاك المزيد من التعليمات البرمجية بسبب استدعاء الأسلوب في Tostring ().

أعتقد أنه من المهم الإشارة إلى الأشخاص الذين أجابوا في ذكر "Tostring" لاحظ أن الأحرف الصغيرة "T" تتحدث عموما عن جافا، والأشخاص الذين أجابوا على ذكر "Tostring" يشير عموما إلى C #. بالطبع، هذا لا ينطبق على جميع الردود.

في ملاحظتي الخاصة (أستخدم كل يومين)، يتم تشجيع المبرمجين في C # على تجاوز "ToString" لعرض تمثيل نصي مفيد. في حين، في جافا، لا أرى هذا ما يقرب من ذلك. في الواقع، نادرا ما أرى هذا.

-jp.

لأول مرة toString يجب أن تعيد الطريقة تمثيل نصي قابل للقراءة من البشر للكائن.

تربط هذه المشكلة جاوة فعالة كما البند 10: دائما تجاوز toString.

يشير إلى ذلك مواصفات Java API. ل Object.toString طريقة:

يجب أن تكون النتيجة تمثيل موجز ولكنه من السهل على الشخص قراءته.

بصرف النظر عن تصحيح الأخطاء، تجاوزت toString طريقة الفصل يمكن أن تكون مفيدة عند ading الكائنات في JList أو أ JTable, ، والتي بشكل افتراضي سوف تستخدم toString طريقة لعرض الكائن كنموذج نصي في القائمة أو الجدول.

على سبيل المثال، في حالتي، لقد تجاوزت toString طريقة الكائنات التي تضاف إلى JList بحيث يكون المستخدم قادرا على رؤية معلومات حول العنصر في قائمة من خلال واجهة المستخدم الرسومية.

لذلك، هناك بالفعل حالات حيث toString الطريقة مفيدة للحالات بخلاف تصحيح الأخطاء. المفتاح هو أن يكون toString طريقة إرجاع المعلومات التي هي مفيدة بالفعل لشخص يرى، وليس الافتراضي Object.toString التنفيذ حيث يتم استخدام موقع ذاكرة الكائن في تمثيله النصي.

مفيد ل

  1. واجهة المستخدم الرسومية (الممتلكات المعقدة عند استخدام PropertyGrid، نص رأس الشكل)
  2. Databinding (هذا هو الطريقة التي تعمل بها)

وأي خرج سلسلة آخر.

يتم استدعاء Tostring () أيضا بواسطة .NET Framework ضمنيا عند طباعة أي كائن خارج إلى سلسلة.

Console.WriteLine("My Object is" + object.ToString());

أي ما يعادل

Console.WriteLine("My Object is" + object);

لأن ToString () يسمى ضمنيا.

أعتقد، رغم أنني لست متأكدا، أنه يستخدم من قبل المصحح ل "قيمة" كائن. هذا يمكن أن يكون مفيدا إلى حد ما، على الرغم من محدود. في معظم الحالات، فإن كتابة مريض المصحح الخاص بك سيكون فكرة أفضل.

في AS3، كان علي تحويل صفيف ثنائية الأبعاد إلى صفيف 1D. الأسرع (سرعة التشغيل) وأسهل الحل (وقت الترميز) كان:

var new1DArray:Array = the2DArray.toString().split(",");

تفاجأ لكنها تعمل بالفعل على النحو المقصود وسريع جدا، أيضا!

يمكنني استخدام Tostring () طن لتنسيقات DateTime.

http://hunterconcepts.com/content/tools/formats/

بصرف النظر عن ما قاله أي شخص آخر بالفعل، فإن الغالبة ToString () مفيد أيضا عند استخدام الضوابط التي تطلق عليها. على سبيل المثال، a combobox:

myComboBox.Items.Add(new MyClass());
// now, whatever ToString() returns is shown in the
// ComboBox, but you can get the object back by through
// the SlectedItem property.

قد لا يكون استخدام "المواضيع" لكنني استخدمته لتسلسل البيانات

storeToHardDrive(studentList.ToString());
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top