هل جميع الفئات النهائية غير قابلة للتغيير؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

هل جميع الفئات النهائية في Java غير قابلة للتغيير؟كل من String و Integer كلاهما فئتان نهائيتان وكلاهما غير قابل للتغيير على ما أعتقد.

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

المحلول

ولا - فئة النهائية يعني أنك لا يمكن أن ترث منه. عليها أن تفعل مع التحولية شيء. الطبقة التالية هي النهائية بعد قابلة للتغيير:

public final class FinalMutable {
  int value;
  public void setValue(int v) { value=v; }
  public int getValue() { return value; }
}

نصائح أخرى

لا، يعني نهائي لا يمكن تمديد الطبقة. تقول شيئا عن التحولية. على سبيل المثال:

final class MutInt {
   public int modifyMe;
}

وليس هناك الكلمة للثبات، انها أشبه نمط التصميم.

وتحرير:
وهذا يعني، لا يوجد الكلمة، التي تجعل فئة غير قابل للتغيير. لجعل فئة غير قابل للتغيير، لديك لحماية الأجزاء الداخلية من خلال جعلها نهائي أو خاصة.

والشيء مربكا هو: الكلمة النهائية معاني مختلفة عند استخدامها على فئة ذلك الحين عند استخدامها على حقل / متغير. الوسائل السابقة "هذه الفئة لا يمكن تمديد". يعني الثاني "هذا المتغير (أو إشارة) لا يمكن تغيير".

وبالإضافة إلى ردود أخرى، إذا نظرتم الى رمز لjava.lang.String سترى أنه يحتوي على حقل: hash، وهو على قابلة للتغيير و هو في الواقع حسابها وتخزينها عندما يتم استدعاء hashCode() ل في المرة الأولى.

ومع ذلك، فإن الطبقة لا تزال على غير قابل للتغيير : لحقل hash لا يمكن الوصول مباشرة أو تعديلها خارج الطبقة

.

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

private final List<String> values;

public List<? get String> getValues() {
  return Collections.unmodifiableList(values);
}

كما قال الآخرون من قبل final لا يجعل الفصل غير قابل للتغيير في Java على الرغم من أنه يلعب دورًا في استراتيجية الثبات.للحصول على الثبات يجب عليك اتباع الإرشادات العامة:

  • تأكد من عدم إمكانية تجاوز الفصل - قم بإنشاء الفصل final, أو استخدام المصانع الثابتة والحفاظ على خصوصية المقاولين
  • جعل الحقول private و final
  • إجبار المستدعيين على إنشاء كائن بالكامل في خطوة واحدة، بدلاً من استخدام مُنشئ بدون وسيطات مقترنًا باستدعاءات لاحقة لـ setXXX الأساليب (أي تجنب اتفاقية Java Beans)
  • لا تقدم أي طرق يمكنها تغيير حالة الكائن بأي شكل من الأشكال - وليس فقط setXXX الأساليب، ولكن أي طريقة يمكن أن تغير الحالة
  • إذا كان لدى الفصل أي حقول كائن قابلة للتغيير، فيجب نسخها بشكل دفاعي عند تمريرها بين الفصل والمتصل به

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

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

لا يمكن تحور A الطبقات ثابتة النهائية. هنا أدناه فإنه يدل على فئة ثابتة غير نهائية يتم تحور:

// a class not intended to be mutated 
public class GoodClass{

   private String name;

   public GoodClass() {
       this.name = "Good Class Neme";
   }

   public String getName() {
       return name;
   }
}

public class BadClass extends GoodClass {

   private String name;

   public String getName() {
       return name;
   }

   // mutating state
   public void setName(String name) {
       this.name = name;
   }
}



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