سؤال

أنا جديد على Java ، ولكن لدي بعض الخبرة في OOP مع ActionScript 3 ، لذلك أحاول الترحيل بالاعتماد على الأشياء التي أعرفها.

في ActionScript 3 ، يمكنك إنشاء Getters و Petters باستخدام الكلمات الرئيسية GET and SET ، مما يعني أنك تقوم بإنشاء طريقة في الفصل والوصول إلى بيانات من خلال خاصية مثيل لتلك الفئة. قد أبدو معقدًا ، لكنه ليس كذلك. هذا مثال:

class Dummy{

    private var _name:String;

    public function Dummy(name:String=null){
        this._name = name;
    }

    //getter
    public function get name():String{
        return _name;
    }

    //setter
    public function set name(value:String):void{
    //do some validation if necessary
        _name = value;
    }

}

وسأوصول name في كائن على النحو التالي:

var dummy:Dummy = new Dummy("fred");
trace(dummy.name);//prints: fred
dummy.name = "lolo";//setter
trace(dummy.name);//getter

كيف أفعل ذلك في جافا؟

مجرد وجود بعض الحقول العامة أمر غير وارد. لقد لاحظت أن هناك هذه الاتفاقية لاستخدام GET والتعيين أمام الأساليب ، والتي أنا موافق عليها.

فمثلا،

class Dummy{

    String _name;

    public void Dummy(){}

    public void Dummy(String name){
        _name = name;
    }

    public String getName(){
        return _name;
    }

    public void setName(String name){
        _name = name;
    }

}

هل هناك ما يعادل Actionscript 3 Getter/Setters في Java ، كما هو الحال في الوصول إلى حقل خاص كحقل من مثيل للفصل ، ولكن لديك طريقة لتنفيذ ذلك داخليًا في الفصل؟

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

المحلول

لا. AS3 getters و setters شيء ecmascript. في Java ، أنت عالق مع وظائف GetVal () و setval ()-لا يوجد أي سكر نحوي لجعل الأمور سهلة بالنسبة لك.

أعتقد أن Eclipse يمكن أن يساعد في توليد هذه الأنواع من الأشياء على الرغم من ...

نصائح أخرى

رمز Java الخاص بك على ما يرام ، إلا أنك تريد أن تصنع _name خاص.

لا يوجد احصل على و تعيين الكلمات الرئيسية في Java كما في مثال AS3 الخاص بك. آسف ، لا تتحسن مما تفعله بالفعل.

الرمز المصحح:

class Dummy {
  private String _name;

  public void Dummy() {}

  public void Dummy(String name) {
    setName(name);
  }

  public String getName() {
    return _name;
  }

  public void setName(String value) {
    _name = value;
  }
}

للأسف ، لا ، لا يوجد دعم معادل على مستوى اللغة في جافا.

على الرغم من أن أنماط Get* and Set* على الرغم من كونها ثابتة في ثقافة Java ، فستجد دعم IDE قويًا لهم (على سبيل المثال ، سيجعلها Eclipse لك تلقائيًا) ، وإذا كنت تعمل في شيء يستخدم لغة التعبير أولاً تم صنعه لـ JSPS (EL) ، ثم ستتمكن من استخدام تدوين الخاصية للوصول إلى GetTers والمستقبين.

سأفكر في عدم وجود getter أو setter لأنهم لا يفعلون أي شيء في قضيتك باستثناء جعل الكود أكثر تعقيدًا. إليك مثال بدون getters أو المستقلين.

class Dummy {
  public String name;
  public Dummy(String name) { this.name = name; }
}

Dummy dummy = new Dummy("fred");
System.out.println(dummy.name);//getter, prints: fred
dummy.name = "lolo";//setter
System.out.println(dummy.name);//getter, prints: lolo

IMHO لا تجعل الأمور أكثر تعقيدًا مما تحتاج إليه. في كثير من الأحيان ، سيعاني إضافة التعقيد أنت مع ذلك ، تشير إلى أن هناك

طريقة مستقلة IDE هي الاستخدام لومبوك, ، وهي مكتبة قائمة على التعليقات التوضيحية التي تولد getters ، والمقابزين ، وحتى equals() و hashcode(). يقوم بذلك للمترجم ، ولكن ليس في الملف المصدر ، لذلك لا يتعين عليك إلقاء نظرة على الأساليب ، فقط استخدمها.

في Java ، فإن الخيار الوحيد الذي لديك دون تعريض الداخلية لكائنك هو جعل Getters و Petters الخاصة بك كما لديك في مثالك.

الاتفاقية هي الإعداد get أو set أمام الحقل الذي يتم تغييره. لذلك ، كما في مثالك ، الحقل name سيكون getName و setName أساليب مثل getter المقابلة و setter ، على التوالي.

وأيضًا قبل إضافة المستقدين والغزاء ، قد يكون من الجيد أن تسأل نفسك لماذا تعرض البيانات الداخلية للكائن المعني.
أقترح عليك قراءة هذا المقال -http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html

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