Pertanyaan Mengapa menyertakan nama kelas saat merujuk ke variabel statis?


Saat mengerjakan PR di Jawa saya menjawab pertanyaan dengan menulis metode instan, dalam metode yang saya gunakan beberapa static final variabel yang termasuk dalam kelas metode ini. Saya menulis nama variabel statis tanpa awalan dengan nama kelas, misalnya:

for(int i=0; i < MY_STATIC_VARIABLE; i++)

dari pada

for(int i=0; i < MyClass.MY_STATIC_VARIABLE; i++)

Ini dilupakan dan dikerjakan dengan benar. Baru kemudian saya perhatikan saya lupa untuk mengawali nama kelas. Apakah masalah apakah saya memasukkan nama kelas atau tidak? Apakah a static final variabel bertindak seperti variabel global dalam konteks kelasnya?


6
2017-07-20 08:28


asal


Jawaban:


Apakah masalah apakah saya memasukkan nama kelas atau tidak?

Kepada guru Anda, dan orang-orang di masa mendatang meninjau kode di perusahaan tempat Anda bekerja, mungkin. Tapi mungkin tidak - Jika saya meninjau kode Anda, saya sarankan untuk tidak menyebutkan nama kelas dalam kasus ini.

Untuk compiler, tidak, itu tidak masalah.

Apakah variabel final statis bertindak seperti variabel global dalam konteks kelasnya?

Tentu saja


8
2017-07-20 08:30



Apakah a static final variabel bertindak seperti variabel global dalam konteks kelasnya?

Ya semua static anggota tingkat kelas dapat diakses di seluruh kode kelas (final atau sebaliknya), dan mereka tidak perlu diawali dengan nama kelas. Termasuk atau tidak adalah preferensi gaya.

Yang kurang jelas adalah bahwa dalam metode instan, Anda bisa menggunakannya this.MY_STATIC_VARIABLE dan kompiler akan sangat bahagia, meskipun MY_STATIC_VARIABLE bukan bidang contoh. (Dengan bidang statis publik, Anda dapat melakukannya dengan referensi instance apa pun, tidak hanya this.) Anda dapat melakukan hal yang sama dengan static metode. Tapi ini sangat menyesatkan bagi siapa pun yang membaca kodenya. :-) Masih secara teknis preferensi gaya, tapi saya sangat menyarankan untuk tidak melakukannya. Hanya menyebutkan jika Anda akhirnya membaca kode yang terlihat seperti itu pasti ada bug di dalamnya.


4
2017-07-20 08:31



Seperti yang sudah dikatakan Joey, jika Anda berada di dalam kelas, Anda dapat mengaksesnya tanpa kualifikasi. Namun, jika Anda menggunakannya dari kelas lain maka Anda harus menggunakan nama kelas, bukan instance untuk mengaksesnya, untuk membuatnya jelas bahwa itu adalah variabel statis / konstan.

MyClass instance = new MyClass();
instance.MY_STATIC_VARIABLE //not good
MyClass.MY_STATIC_VARIABLE  //good

3
2017-07-20 08:33



Ini dikompilasi baik karena - seperti yang Anda tahu - variabel final statis di kelas yang sama. Ini berarti bahwa variabel berada dalam "lingkup" kode. Dan itu tidak masalah jika Anda menyertakan awalan atau tidak. Hanya ketika Anda ingin mengakses varialbes statis dari kelas lain sebagai arus, Anda harus mengatakan di kelas mana variabel itu berada.

Ini sama saja dengan mengatakan this atau tidak. misalnya:

private String secret;
public String getSecret()
{
    return this.secret;
}

Atau

private String secret;
public String getSecret()
{
    return secret;
}

Ini persis sama.


1
2017-07-20 08:33



Terlepas dari sudut pandang pemeriksa (bahkan Anda di masa depan :-)), juga bagus untuk menjaga awalan nama kelas untuk refactoring cepat saat diperlukan. Ini akan menghindarkan Anda dari perubahan di seluruh kode sumber Anda. Pertimbangkan itu juga!


1
2017-07-20 09:07



Untuk mengklarifikasi komentar saya:

import static java.math.BigDecimal.TEN;
...

public class Foo {

    private static int COUNT = 0;
    private static BigDecimal FIVE = new BigDecimal(5);
    private BigDecimal height;

    public void bar() {
        height = null; // Good
        this.height = null; // Unnecessary qualification

        COUNT++; // Good
        Foo.COUNT++; // Unnecessary qualification

        height = TEN; // Fine
        height = BigDecimal.TEN; // Fine
        height = Foo.FIVE; // Fine; increases clarity by distinguishing it from similar imported static variables
        height = FIVE; // Fine; perhaps the additional clarification is unnecessary
    }
}

1
2017-07-21 01:24



Jenis skenario akses yang berbeda untuk variabel statis dan Instance.

Di sisi metode statis

  • Variabel statis dapat diakses oleh

    1. Jika (variabel statis) dalam kelas yang sama berarti baik itu dapat diakses oleh variablename atau classname.variablename 

    2. Jika (variabel statis) dalam kelas yang berbeda berarti hanya dapat diakses oleh classname.variablename

  • Variabel instan dapat diakses oleh

    1. Jika (Instance variable) dalam kelas yang sama berarti itu hanya dapat diakses oleh objek dari kelas yang sama contoh obj.variablename 

    2. Jika (Instance variable) dalam kelas yang berbeda berarti juga harus diakses oleh objek dari kelas yang berbeda contoh obj.variablename 

Di sisi metode Instance (metode Non statis)

  • Variabel statis dapat diakses oleh

    1. Jika (Statis variabel) dalam arti kelas yang sama baik itu dapat diakses oleh variablename atau classname.variablename 

    2. Jika (Variabel Statis) dalam kelas yang berbeda berarti hanya dapat diakses oleh classname.variablename

  • Variabel instan dapat diakses oleh

    1. Jika (Instance variable) dalam kelas yang sama berarti hanya dapat diakses oleh variablename.

    2. Jika (Instance variable) dalam kelas yang berbeda berarti juga harus diakses oleh objek dari kelas yang berbeda contoh obj.variablename 


1
2018-06-05 07:16