Java 代码不写getter, setter, 转化为 public, 有什么弊端?
PHP中文网
PHP中文网 2017-04-18 10:35:44
0
9
1379
PHP中文网
PHP中文网

认证0级讲师

membalas semua(9)
小葫芦

Nah, sebenarnya terdapat banyak perkara yang boleh anda lakukan melalui kaedah, terutamanya apabila digabungkan dengan idea OO - Jenis ialah maklumat penting.

Selain itu, ini adalah piawaian Java Bean hanya itu "operasi biasa" bagi banyak rangka kerja dan perpustakaan pihak ketiga (yang paling terkenal ialah Spring) juga bergantung pada. ini. Anda boleh mencari artikel yang berkaitan dengan "kacang Jawa di Empayar Jawa".

Bantah sekeras-kerasnya jawapan seperti Logik penulisan penetap. Kod sedemikian sangat mengelirukan. Orang yang berpengalaman tahu bahawa anda tidak boleh menulis logik pada lapisan "bean" (biasanya sepadan dengan lapisan Model), tetapi sekurang-kurangnya pada lapisan Perkhidmatan (mengikut seni bina tiga lapisan biasa). Oleh itu, Setter dalam kes ini tidak begitu penting. Kesimpulannya, jawapan tentang menulis logik dalam Setter semuanya tidak betul.

Akhirnya, izinkan saya mengulas orang yang mengatakan Kewujudan itu munasabah Saya harap dia dapat memahami apa yang "Kewujudan itu munasabah".


Saya ingin membalas secara rasmi kepada orang yang mengkritik saya——Ada beberapa orang yang bercakap tentang logik dalam Setter, dan ada juga orang yang bergantung pada "teori fallacious" Seorang yang datang untuk memujuk orang lain.

Cerita saya, semasa saya mula-mula datang ke komuniti setahun yang lalu. Saya pernah melihat papan tanda yang ditulis oleh master dengan markah yang agak tinggi Rubbish SF! , saya perhatikan rekod reputasinya (pada masa itu, rekod reputasi agak serupa dengan rekod komit GitHub, tetapi ia tidak selama setahun), hampir semua isu telah ditolak undian , jelas sekali ——Ini berniat jahat.

Setelah berada dalam komuniti selama lebih daripada setahun, saya kadang-kadang menghadapi situasi seperti ini. Tetapi kaedahnya tidak begitu buruk, saya akui bahawa saya masih sangat mahir dalam beberapa isu, saya mungkin akan mengelirukan orang lain.

Sekarang keadaan ini tidak dapat saya tahan - jika anda salah, anda salah, Saya masih perlu menyesatkan orang lain. Sayang sekali jika orang lain ditapis kerana gagal soalan asas dalam temuduga !

Akhir sekali, saya ingin memberitahu semua:

  1. Saya tidak akan meninggalkan komuniti hanya kerana saya tidak disukai, walaupun ia tidak disukai dengan niat jahat. Kerana saya perlu menjawab lebih banyak soalan untuk mengelakkan lebih ramai orang baru daripada disesatkan oleh "pemula yang dahsyat". Begitu juga, untuk mengekalkan kualiti komuniti, saya tidak akan pernah melepaskan jawapan yang sangat mengelirukan.

  2. Jika anda tidak percaya saya, sila beritahu penemuduga semasa temuduga bahawa anda sering menulis logik dalam Setter of Java Bean!

  3. Saya mengimbas semua jawapan dengan teliti tadi.

  4. +1 mata untuk menjawab, dan hanya 1 mata untuk mengikuti arah aliran. Dipijak adalah 2 mata. Dan kerana semakin banyak jawapan seperti ini, kualiti komuniti akan menjadi lebih buruk dan lebih buruk Pada masa itu, walaupun anda mempunyai reputasi 1W, jika anda mengatakannya dengan bangga apabila anda berbual atau berkomunikasi, orang lain hanya akan mengejek: Bahawa Kualiti masyarakat tidak tinggi, semuanya hanya mengikut trend.

刘奇

Setiap bahasa mempunyai falsafah yang berbeza. Java sepenuhnya berorientasikan objek dan menggalakkan fleksibiliti dan skalabiliti tinggi kod apabila mengekod . Bahasa seperti Go menyokong kesederhanaan utama kod, jadi anda hanya perlu mentakrifkan struct seperti berikut.

type S struct {
    A string
    B int
}

Tetapi dalam Java anda harus tetap mematuhi spesifikasi dan menentukan kaedah javabean untuk get/set, kerana anda mematuhi spesifikasi untuk menikmati faedah yang dibawa oleh spesifikasi kepada anda. Contohnya, apabila anda mengakses perpustakaan pihak ketiga, Apabila menggunakan reflect untuk mengendalikan javabean, kebanyakan mereka menggunakan kaedah get/set. Jika javabean anda tidak mempunyai kaedah get/set pada masa ini, jelas sekali anda tidak boleh menggunakan pustaka ini.


Berdasarkan pengalaman peribadi, kesederhanaan kod adalah lebih penting daripada fleksibiliti dan kebolehskalaan kod. Oleh itu, kit alat seperti java juga muncul dalam lombok, yang boleh memudahkan kod dengan baik.

伊谢尔伦

Orang di atas telah berkata begitu banyak, tetapi mereka telah terlepas satu perkara Kaedah adalah polimorfik, tetapi atribut bukan polimorfik. Sebagai contoh, Person ialah kelas induk, Man ialah subkelas, kedua-dua kelas induk dan subkelas mempunyai atribut Nama (walaupun ini sangat jarang berlaku), dan nama dalam kelas induk dan subkelas kedua-duanya adalah awam. Sila lihat kod berikut:

Person p = new Man();
p.name = "person";
Print(p.name);
Print(p.getName());

Jawapan akan mengeluarkan
orang
null

迷茫

Ini soalan yang bagus! Mengapa tidak kita umumkan sahaja bidang persendirian ini daripada menggunakan setter dan getter yang menyusahkan? Terdapat beberapa sebab:

Jangan sekali-kali mempercayai input pelanggan

Mari kita anggap kelas ini:

class Bicycle {
    public int speed;
    
    // ...
}

public class BicycleTest{
    public static void main(String[] args){
        Bicycle b = new Bicycle();
        b.speed = 300000; //什么?自行车这么快?不科学啊?自行车车速不超过120吧。
        // 可是作为程序员的我怎么办呢?只能在文档里告诉用这个类的人:超过120罚款?
        // WTF!写这个类的程序员该死。
        b.speed = -30; // 这个?负的速度,高中物理?我勒个去。
    }
}

Adakah lebih baik jika kita menukarnya kepada ini:

class Bicycle {
    private int speed;
    
    public int setSpeed(int speed) {
        if(speed > 120){
            this.speed = 120;
        } else if(speed < 0){
            this.speed = 0;
        } else{
            this.speed = speed;
        }
    }
    public int getSpeed() {
        return speed;
    }
}

public class BicycleTest{
    public static void main(String[] args){
        Bicycle b = new Bicycle();
        b.speed = 300000; 
        System.out.println(b.getSpeed()); // 显示120
    }
}

Mudah diubah suai

Andaikan kelajuan kini diperlukan antara 0-40. Tanpa getter dan setter, semua kod perlu ditulis semula, dan mustahil untuk diselesaikan dalam masa kurang dari satu jam. Dengan setter ini, ia adalah mudah, hanya menukar logik setter Jika ia tidak selesai dalam 1 minit, pengaturcara boleh memulakannya.

public int setSpeed(int speed) {
        if(speed > 40){
            this.speed = 40;
        } else if(speed < 0){
            this.speed = 0;
        } else{
            this.speed = speed;
        }
    }
黄舟

Pemahaman saya ialah kebaikan dan keburukan adalah relatif Untuk "program kecil", tidak ada keburukan, kerana anda dan penyelenggara lain boleh melihat dan mengawal dengan jelas perubahan dalam nilai parameter Pada masa ini, kerana anda Ia boleh mengawal sepenuhnya setiap sudut program, public malah "kebaikan melebihi keburukan", kerana tanpa setter&getter, banyak kod dikurangkan. Tetapi apabila program itu "besar" pada skala tertentu, patutkah kita mempertimbangkan kebolehselenggaraan program Contohnya, jika a.money dan a.getMoney() tiba-tiba menambah faktor a.action pada 影响money suatu hari nanti, apakah yang perlu kita lakukan? lakukan? Pastikan setiap pemanggil money dapat mengetahui peraturan pengaruh faktor, jelas sekali 直接a.money就不那么可靠. Dari perspektif menulis program, anda harus menulis lebih banyak kaedah Inilah yang diajar oleh guru pengaturcaraan komputer universiti saya. Dari perspektif berorientasikan objek, objek harus menyediakan kaedah untuk mengendalikan objek, jadi ia masih kaedah dan setter和getter merangkumi idea ini. Dari segi ciri Java, setter和getter merangkumi idea ciri pengkapsulan Dalam contoh di atas, apabila pengguna wang lain perlu menghubungi money, pemanggil tidak perlu tahu bahawa terdapat faktor tindakan di sana, dia. hanya perlu getMoney()Cukup dapatkan money yang betul Pembolehubah adalah peribadi dan menyediakan kaedah awam untuk pembolehubah pengendalian. Pada masa ini, kelebihan mengatasi kelemahan. Mereka yang mempunyai sedikit bakat dan sedikit pengetahuan, bercakap dari keluarga yang sama, dan menerima kritikan dan pembetulan jika mereka memahami sesuatu yang tidak sesuai.


Selain itu, mengenai masalah logik dalam setter&getter, saya fikir ia adalah persoalan "sepatutnya", dan bukannya soalan "bolehkah ia dilakukan". Bagi yang pertama, anda perlu menimbang kebaikan dan keburukan Apabila logik program dan kawalan risiko anda baik, anda akan senang untuk menulis. Rangka kerja yang sangat baik itu tidak ditulis dengan cara ini, dan ia mesti berdasarkan kebaikan dan keburukan (pengembangan, dsb.) Adalah perkara biasa untuk meletakkan logik dalam lapisan pemprosesan logik.

洪涛

Pertama sekali, terjemahan kaedah ialah kaedah.


Kalau begitu biar saya faham kekeliruan anda

Tetapi adakah anda benar-benar perlu memikirkan masa depan?

Malah, sebab utama anda tidak melakukan ini adalah kerana ia sangat menyusahkan.

Tetapi sebenarnya, anda akan mempunyai medan (medan, atribut) yang mesti menggunakan penetap pengambil, seperti medan baca sahaja, jadi 1⃣️, untuk ketekalan kod keseluruhan, adalah lebih baik menggunakan semua pengambil dan penetap .
2⃣️, menggunakan bantuan idea sebenarnya tidak memerlukan banyak usaha untuk diselesaikan.
3⃣️, ini pada dasarnya adalah perkara normatif, tidak perlu memikirkan sama ada perlu melakukan ini.
4⃣️, dalam beberapa kes, getter dan setter memang tidak diperlukan Jika anda yakin bahawa data di sini sangat mudah, hanya buat ia umum secara langsung.


Mengenai soalan lain

Jika medan peribadi menyediakan getter dan setter, maka ia dianggap awam, yang tidak konsisten dan awam

harus digunakan.

Apakah tujuannya

Pertama sekali, medan peribadi mungkin hanya mempunyai pengambil dan penetap, yang secara semula jadi tidak dianggap awam. Jika terdapat kedua-dua setter dan getter, ia tidak semudah yang anda fikirkan. Kerana penyetel pengambil yang anda tulis sendiri tidak mempunyai sebarang logik pemprosesan, tetapi anda menganggap ini

private String name;

public void setName(String name) {
    this.name = name.trim();
}

public String getName() {
    return name;
}

Jika anda mempunyai keperluan yang sama seperti contoh ini, anda perlu mengalih keluar ruang tambahan semasa menyimpan nama. (Dengan cara ini, saya tidak dapat menjamin bahawa sintaks kod di atas adalah betul. Saya sudah lama tidak menulis Java.


Berkenaan dengan persoalan sama ada panggilan medan terbuka lebih selesa, sebenarnya medan terbuka ular sawa yang anda sebutkan bukan medan terbuka, bukan? Medan storan sebenar ialah _name, dan getter dan setter ialah nama Ini hanya berbeza dalam sintaks daripada Java, tetapi intipatinya adalah sama.

Saya akan meletakkan dua keping kod lagi untuk menunjukkan manfaat getter dan setter.

private int userId;

public User getUser();

public void setUser(user);

Contoh lain

private Map data;

public User getUser();

public int getStatus();
小葫芦
class GoodDog {
    private int size;
    
    public int getSize() {
       return size;
    }

    public void setSize(int s){
       size = s;
    }
}

Terdapat isu enkapsulasi dan kawalan di sini. Katakan anda mengakses terus harta goodDog.size secara tiba-tiba suatu hari nanti, anda mungkin perlu menapis sesuatu untuk setiap saiz, atau untuk saiz tertentu, apakah yang perlu anda lakukan? Kemudian anda perlu menambah mekanisme penapisan di mana-mana sahaja di mana goodDog.size muncul. Jika anda menggunakan kaedah getSize(), maka saya akan menapisnya dalam kaedah ini dan ia akan menjadi OK. Sebenarnya, idea keseluruhan adalah untuk melakukan sesuatu dari perspektif berorientasikan objek Jika anda mahukan sesuatu, beritahu saya dan saya akan datang ke rumah untuk mendapatkannya, tetapi anda tidak boleh masuk terus ke dalam rumah untuk mendapatkannya. ia. Sekiranya anda tidak biasa dengan rumah saya. Apakah yang perlu saya lakukan jika keluarga saya kacau?

Jika goodDog .size=12 ditetapkan secara langsung, ia tidak selamat. Bagaimana jika nilai saiz kurang daripada 10
Adakah perlu untuk mengesahkan setiap tetapan atribut untuk mengelakkan perkara ini berlaku, Java menukar nilai secara seragam dan mengawal julat semasa kaedah yang ditetapkan, supaya apabila keperluan berubah pada masa hadapan, anda tidak perlu mencari tempat di seluruh dunia untuk menggunakan goodDog .size

Kaedah dengan parameter dan kaedah tanpa parameter bergantung pada penggunaan kaedah tertentu Kaedah set dan kaedah get adalah untuk mencerminkan idea pengkapsulan pengaturcaraan berorientasikan objek ditetapkan kepada peribadi dan hanya boleh diubah suai dan diakses melalui kaedah khusus untuk memastikan keselamatan program .

Terdapat juga jawapan di atas, seperti kacang java atau hibernate, apabila mengalih keluar atribut, ia tidak mengambil saiz atribut yang anda tentukan, tetapi mengambil getSize anda, dan kemudian mengalih keluar huruf kecil S kaedah get untuk mendapatkan saiz.

Atau jika anda masih tidak faham, ingat ini: Kewujudan adalah munasabah Suatu hari, apabila menulis sekeping kod, anda akan tiba-tiba menyedarinya.

大家讲道理

Awam boleh digunakan dalam senario mudah Penyetel dan pengambil terutamanya tertutup kepada dunia luar Anda boleh menambah beberapa pemprosesan bersatu pada penyetel dan pengambil, yang juga mudah untuk pembinaan semula.

刘奇

Saya ingin menambah bahawa untuk menyembunyikan keterlihatan, kaedah setter dan getter tidak semestinya mengakses nilai secara langsung, dan beberapa logik pemprosesan juga boleh ditambah.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan