الاستدعاء الصريح مقابل الضمني لـ toString

StackOverflow https://stackoverflow.com/questions/328661

  •  11-07-2019
  •  | 
  •  

سؤال

اعتدت استخدام الاستدعاء الضمني لـ toString عند الرغبة في الحصول على بعض معلومات التصحيح حول كائن ما، لأنه في حالة كون الكائن فارغًا، فإنه لا يلقي استثناءً.

على سبيل المثال:

System.out.println("obj: "+obj);

بدلاً من:

System.out.println("obj: "+obj.toString());

هل هناك أي فرق بصرف النظر عن الحالة الفارغة؟
هل يمكن أن تنجح الحالة الأخيرة، عندما لا تعمل الحالة الأولى؟

يحرر:
ما الذي يتم فعله بالضبط في حالة المكالمة الضمنية؟

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

المحلول

وهناك فارق كبير. استخدام واحد وهذا أقصر وتعمل في أكثر الأحيان.

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

String s = String.valueOf(obj);

تعديل : في. وقد مددت المسألة، ولذا فإنني سوف أتقدم الجواب

في كلتا الحالتين، فإنها تجمع على شيء كما يلي:

System.out.println(new StringBuilder().append("obj: ").append(obj).toString());

عند toString() الخاص بك هو ضمني، سترى أنه في إلحاق الثاني.

إذا نظرتم الى شفرة المصدر لجافا، سترى أن StringBuilder.append(Object) يبدو مثل هذا:

public StringBuilder append(Object obj) {
    return append(String.valueOf(obj));
}

وحيث String.valueOf يبدو مثل هذا:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

والآن، إذا كنت toString() نفسك، يمكنك تجاوز الاختيار لاغيا وإطار مكدس والذهاب مباشرة الى هذا في StringBuilder:

public StringBuilder append(String str) {
    super.append(str);
    return this;
}

وهكذا ... أشياء مشابهة جدا يحدث في كلتا الحالتين. واحد فقط يقوم بمزيد من العمل القليل.

نصائح أخرى

كما قال الآخرون - استخدم "" + obj طريقة.

بحسب ال مواصفات لغة جافا:

  • إذا كان المصطلح فارغًا، فاستخدمه "null"
  • يتم تحويل الأنواع البدائية باستخدام مُنشئ النوع المعبأ new Boolean(X) أو أيا كان
  • toString() تم استدعاؤه (أو ما يعادله)
  • إذا نتيجة ل toString() يكون null, ، يستخدم "null"
  • قم بتسلسل السلاسل.

لا فرق ما عدا، وكأنك تقول، وسلامة فارغة. تفضل دائما الأول إلى الثاني.

في الواقع، إذا ثابتة بك يقول الكائن لا ينبغي أبدا أن يكون لاغيا، لا يهم. لذلك يعتمد على ما إذا كان أو لم يكن ليقبل الكائنات لاغيا.

فمن السهل جدا أن يكتب نوع مرجع عام.

class ref
{
  static public class Reference<T>
  {
    private T value;
    public Reference(T value) { set(value); }
    public Reference() { set(null); }
    public void set (T value) { this.value = value; }
    public T get () { return this.value; }
    public String toString() { return String.valueOf(this.value); }
  }

  static void fillString (Reference<String> str)
  {
    str.set("foo");
  }

  public static void main (String[] args)
  {
    Reference<String> str = new Reference<String>("");
    fillString(str);
    System.out.println (str);
  }
}

وتشغيل فإنه يعطي النتائج المطلوبة:

javac ref.java && java ref
foo
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top