لماذا يتم الوصول إلى أسلوب ثابت من طريقة سيئة غير ثابت؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

ونتبيانس يقول لي انها سيئة للوصول إلى أسلوب ثابت من أسلوب غير ثابت. لماذا هذا سيء؟ "الوصول ثابت getInstance طريقة" هو تحذير:

import java.util.Calendar;

public class Clock
{
    // Instance fields
    private Calendar time;

    /**
     * Constructor. Starts the clock at the current operating system time
     */
    public Clock()
    {
        System.out.println(getSystemTime());
    }

    private String getSystemTime()
    {
        return this.time.getInstance().get(Calendar.HOUR)+":"+
                this.time.getInstance().get(Calendar.MINUTE);
   }

و}

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

المحلول

وربما كنت الوصول إلى أسلوب ثابت من مثيل بدلا من مباشرة. حاول استخدام Calendar.getInstance() بدلا من ذلك:

private String getSystemTime()
{
    return Calendar.getInstance().get(Calendar.HOUR)+":"+
           Calendar.getInstance().get(Calendar.MINUTE);
}

نصائح أخرى

وماذا تقصد ب "العودة أسلوب ثابت"؟ لا ضير في استدعاء أسلوب ثابت من أسلوب مثيل في رأيي - تبعا للظروف، بطبيعة الحال. هل يمكن إضافة بعض التعليمات البرمجية التي يشكو نتبيانس عنه؟

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

وتحرير: والسؤال محررة، وهذا يجعل الكثير من معانيها. IMO انها نقص في جاوة التي تسمح له في المقام الأول. يمكن أن يجعل لرمز مضلل جدا. بلدي على سبيل المثال المفضل (وهو ما يعني القدامى قد يكون قد رآني بعد ذلك قبل :) هو مع Thread.sleep. ما تقوم به <م> نظرة مثل هذا الرمز لا؟

Thread t = new Thread(someRunnable);
t.start();
t.sleep(1000);

لرأيي، يبدو أن يطلب من ترابط جديد إلى النوم - على غرار دعوة إلى suspend. ولكن لا - يمكنك أن تطلب فقط موضوع تنفذ حاليا على النوم، وهذا هو السبب Thread.sleep هو أسلوب ثابت. رمز أعلاه هو جافا القانوني، وسيجعل النوم موضوع تنفذ حاليا لفترة ثانية في حين أن موضوع تم إنشاؤها حديثا (ربما) يعمل ... وليس في كل ما يبدو رمز مثل لأول وهلة.

هل لديك أمر عكس؟ إذا كان الأمر كذلك، فمن المنطقي أنه لا يمكن الوصول إلى طريقة غير ثابت من أسلوب ثابت. إذا لم يكن كذلك، أود أن أعرف لماذا هذا أمر سيء كذلك!

لا يمكن أن يكون مرجعا وهناك طريقة غير ثابت من سياق ثابت. يمكن الرجوع إليها أساليب ثابتة من سياق غير ثابت.

هل هو خطأ نتبيانس أو التحذير؟ يمكنك إضافة التعليمات البرمجية التي تسبب ذلك؟

وانها على ما يرام لاستدعاء time.getInstance(). فإن المترجم ننظر إلى نوع المتغير، Calendar في هذه الحالة، واستدعاء الأسلوب هناك. ينتهي يجري تجميع تماما كما Calendar.getInstance(). لاحظ أن القيمة الفعلية للtime لا يسهم في هذا، أي أنه يمكن أن يكون حتى null ولا يهم.

وانها هذه المراوغة والاختلاف من الأساليب العادية التي تثير الامتعاض. فمن الأفضل للتعبير عن ذلك مباشرة كما Calendar.getInstance().

لماذا فقط لا يفسر بسيط:

وإذا كنت استدعاء الأسلوب nonstatic، 1) إنشاء مثيل جديد مع = فئة جديدة ()؛ 2) ثم استدعاء الأسلوب a.method؛

وإذا كنت استدعاء أسلوب ثابت: 1) الذي يطلق عليه Class.method؛

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

في جافا سيتم تحميل كل المتغيرات عضو ثابت في الذاكرة أولا،   ثم سيتم تحميل جميع أعضاء ثابتة،   بعد سيتم تحميل تلك المتغيرات غير ثابت وظائف عضو في الذاكرة،   بعد وسيتم تنفيذ تلك الكتلة الرئيسية ثابت ....... لذلك كان يعطي الخطأ الذي غير ..............

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