Saya mencoba membuat game Tetris dan saya mendapatkan kesalahan kompiler
Shape is not an enclosing class
ketika saya mencoba membuat objek
public class Test {
public static void main(String[] args) {
Shape s = new Shapes.ZShape();
}
}
Saya menggunakan kelas batin untuk setiap bentuk. Ini bagian dari kode saya
public class Shapes {
class AShape {
}
class ZShape {
}
}
Apa yang saya lakukan salah?
java
inner-classes
V Sebi
sumber
sumber
new Shape().new ZShape();
. KelasZShape
membutuhkan instance yang dilampirkan untuk dipakai.AShape
danZShape
memperluas kelas dasarShapes
. Kelas Nesting bukan desain yang benar-benar bagus untuk masalah ini.Jawaban:
ZShape
tidak statis sehingga membutuhkan turunan dari kelas luar.Solusi paling sederhana adalah membuat ZShape dan kelas bertingkat apa pun
static
jika Anda bisa.Saya juga akan membuat bidang apa pun
final
ataustatic final
yang Anda bisa juga.sumber
ZShape
static
benar-benar mengalahkan tujuan dari apa yang dia coba lakukan, yang merupakan contoh dariZShape
.static
lebih mudah, bukan lebih keras.ZShape myShape = new Shape().instantiateZShape();
. Ini menyiratkan ZShape yang Anda dapatkan tidak ada tanpa Shape, yang maksudnya di sini.Misalkan RetailerProfileModel adalah kelas utama Anda dan RetailerPaymentModel adalah kelas dalam di dalamnya. Anda bisa membuat objek kelas dalam di luar kelas sebagai berikut:
sumber
underTest = Mockito.mock(Outer.class).new InnerNonStaticClass();
Apa yang saya sarankan adalah tidak mengubah kelas non-statis ke kelas statis karena dalam kasus itu, kelas batin Anda tidak dapat mengakses anggota non-statis dari kelas luar.
Contoh:
Jadi, dalam hal ini, Anda dapat melakukan sesuatu seperti:
sumber
Outer.Inner obj = new Outer().new Inner();
()
adalah wajib. Namun, C, C ++ itu bukan keharusan. Ini adalah contoh yang tidak berfungsi. Apalagi saya menemukan posting ini . yang menjelaskan lebih lanjut tentang tata bahasa di Jawa dan bagaimana mereka diuraikan. Saya akan senang melihat contoh kasus ketika sintaks ini bekerja untuk Anda.Sebagaimana dinyatakan dalam dokumen :
sumber
Terkadang, kita perlu membuat instance baru dari kelas dalam yang tidak bisa statis karena tergantung pada beberapa variabel global dari kelas induk. Dalam situasi itu, jika Anda mencoba membuat instance kelas dalam yang tidak statis,
not an enclosing class
kesalahan dilemparkan.Mengambil contoh pertanyaan, bagaimana jika
ZShape
tidak bisa statis karena perlu variabelShape
kelas global ?Bagaimana Anda bisa membuat instance baru
ZShape
? Begini caranya:Tambahkan getter di kelas induk:
Akses seperti ini:
sumber
sumber
Saya mengalami masalah yang sama. Saya memecahkan dengan membuat contoh untuk setiap Kelas publik dalam. Adapun situasi Anda, saya sarankan Anda menggunakan warisan selain kelas batin.
maka Anda dapat Bentuk baru (); dan kunjungi ZShape melalui shape.zShape;
sumber
Tidak perlu menjadikan kelas bersarang sebagai statis tetapi harus publik
sumber
Satu hal yang saya tidak sadari pada awalnya ketika membaca jawaban yang diterima adalah bahwa membuat kelas internal statis pada dasarnya sama dengan memindahkannya ke kelas tersendiri.
Jadi, saat mendapat error
Anda dapat menyelesaikannya dengan salah satu cara berikut:
static
kata kunci ke kelas batin, atausumber
Dalam kasus jika kelas Induk adalah singleton gunakan cara berikut:
di mana
getInstance()
akan mengembalikan objek singleton kelas induk.sumber
Untuk mencapai persyaratan dari pertanyaan, kita dapat menempatkan kelas ke dalam antarmuka:
dan kemudian gunakan seperti yang penulis coba sebelumnya:
Jika kita mencari solusi "logis" yang tepat, sebaiknya digunakan
fabric
pola desainsumber