هل يمكن إنشاء طبقة متداخلة ثابتة عدة مرات؟
-
01-10-2019 - |
سؤال
بالنظر إلى ما أعرفه عن كل نوع آخر من الميزات الثابتة للبرمجة - أعتقد أن الإجابة "لا". ومع ذلك ، فإن رؤية بيانات مثل OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
يجعلني أتساءل.
المحلول
نعم ، لا يوجد شيء في دلالات أ static
نوع متداخل يمنعك من القيام بذلك. هذا المقتطف يعمل بشكل جيد.
public class MultipleNested {
static class Nested {
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Nested();
}
}
}
أنظر أيضا
public static interface Map.Entry<K,V>
public static class AbstractMap.SimpleEntry<K,V>
- ربما النوع المتداخل الأكثر شهرة. من الواضح أنه تم إنشاؤه عدة مرات.
الآن ، بالطبع ، يمكن للنوع المتداخل أن يقوم بالتحكم في الحالة الخاصة به (على سبيل المثال private
المُنشئون ، نمط المفرد ، إلخ) ، لكن هذا لا علاقة له بحقيقة أنه نوع متداخل. أيضا ، إذا كان النوع المتداخل هو static enum
, ، بالطبع لا يمكنك إنشاء مثيل له على الإطلاق.
لكن بشكل عام ، نعم ، أ static
يمكن إنشاء نوع متداخل عدة مرات.
لاحظ أنه من الناحية الفنية ، أ static
النوع المتداخل ليس نوعًا "داخليًا".
JLS 8.1.3 الفصول الداخلية والحالات المرفقة
و داخلي الطبقة هي فئة متداخلة لم يتم إعلانها بشكل صريح أو ضمني
static
.
وهذا هو ، وفقا لمصطلحات JLS ، داخلي الفصل ليس كذلك static
. إذا كان static
, ، ثم هو مجرد نوع متداخل.
إذن ماذا يفعل static
يعني؟
static
يعني ببساطة أن النوع المتداخل لا يحتاج إلى مثيل من النوع المرفق ليتم إنشاء مثيل له.
أنظر أيضا
نصائح أخرى
polygenelubricants: ولكن بشكل عام ، نعم ، يمكن إنشاء نوع متداخل ثابت عدة مرات.
فقط للتأكد من أن 100 ٪ من ذلك مددت المقتطف الخاص بك:
public class MultipleInner {
static class Inner {
private int state;
public int getState() { return state; }
public void setState(int state) { this.state = state; }
}
public static void main(String[] args) {
List<Inner> inners = new ArrayList<Inner>();
for (int i = 0; i < 100; i++) {
Inner inner = new Inner();
inner.setState(i);
inners.add(inner);
}
for (Inner inner : inners) {
System.out.println(inner.getState());
}
}
}
وبالطبع والنتيجة هي:
0
1
2
3
.
.
.
97
98
99
إنه قانوني. حقيقة أن الطبقة الداخلية ثابتة تمنحك فائدة هنا ؛ لا ترتبط مثيلاتها بأي مثيل للفئة المحتوية ، بحيث يمكن إنشاء مثيل لها بحرية (طالما أن مؤهل الوصول يسمح بذلك).
ومع ذلك ، فإن السعر هو أن الفئة الداخلية لا يمكنها استخدام الأعضاء/الأساليب غير الثابتة للفئة المحتوية.
نعم يمكنك عمل مثيلات منه عدة مرات كما تريد.
ربما السبب في أنك ترى ذلك ، هو أن البرنامج فكر في تخزين مرجع في مكان ما. على الرغم من أنني أتفق معك يبدو غريبًا: S
يمكن للطبقة الداخلية استخدام الأعضاء غير الثابتة/الأساليب المحتوية على الفصل. يمكنه استخدامها فقط من خلال مرجع كائن للفئة المرفقة-
public class MultipleInner {
private int outerstate =10;
static class Inner {
private int state;
public int getState() { return state; }
public void setState(int state) { this.state = state; }
}
public static void main(String[] args) {
Inner inner = new Inner();
inner.setState(new MultipleInner().outerstate);
System.out.println(inner.getState());
}
}
لذلك ، لا يتعين على الفصل الداخلي دفع ثمن عدم القدرة على الوصول إلى الأعضاء غير الثابتين في الفصل المرفق.
إن الطبقات المتداخلة الثابتة هي بالفعل - فهي ، كما قيل ، فصول المستوى الأعلى التي تعيش في مساحة اسم الطبقة "الخارجية" ، وتطيع دلالات ثابتة فيما يتعلق بالإشارات إلى الطبقة "الخارجية". توضح عينة الرمز هذه:
public class OuterClass {
String outerStr = "this is the outer class!!" ;
public static class StaticNestedClass {
String innerStr = "default / first instance" ;
}
public static void main(String[] args) {
OuterClass.StaticNestedClass nestedObject1 = new OuterClass.StaticNestedClass();
OuterClass.StaticNestedClass nestedObject2 = new OuterClass.StaticNestedClass();
nestedObject2.innerStr = "second instance" ;
System.out.println(nestedObject1.innerStr) ;
System.out.println(nestedObject2.innerStr) ;
}
}
output:
default / first instance
second instance