I campi pubblici di Java sono solo un tragico errore di progettazione storica a questo punto? [chiuso]

17

A questo punto sembra essere l'ortodossia di Java che in pratica non si dovrebbero mai utilizzare i campi pubblici per lo stato dell'oggetto. (Non sono necessariamente d'accordo, ma non è rilevante per la mia domanda.) Dato che, sarebbe giusto dire che da dove siamo oggi, è chiaro che i campi pubblici di Java sono stati un errore / difetto della progettazione linguistica? O c'è un argomento razionale che siano una parte utile e importante della lingua, anche oggi?

Grazie!

Aggiornamento: conosco gli approcci più eleganti, come in C #, Python, Groovy, ecc. Non sto cercando direttamente quegli esempi. Mi sto solo chiedendo se c'è ancora qualcuno in un bunker, borbottando su quanto siano davvero meravigliosi i campi pubblici, e su come le masse siano tutte solo pecore, ecc.

Aggiornamento 2: I campi pubblici finali chiaramente statici sono il modo standard per creare costanti pubbliche. Mi riferivo di più all'utilizzo di campi pubblici per stato oggetto (anche stato immutabile). Sto pensando che sembra un difetto di progettazione che si dovrebbero usare i campi pubblici per le costanti, ma non per lo stato ... le regole di una lingua dovrebbero essere applicate in modo naturale, per sintassi, non per linee guida.

    
posta Avi Flax 21.02.2011 - 19:40
fonte

6 risposte

14

Mi piacciono, purché il campo sia final e sia usato solo internamente nell'applicazione, non esposto in un'API per altre applicazioni. Ciò mantiene il tuo codice più breve e più leggibile.

Non devi esporre i campi pubblici in un'API perché esponendo campi pubblici, esponi anche l'implementazione. Se invece lo esponi come metodo getXXX() , puoi modificare l'implementazione senza modificare l'interfaccia API. Per esempio. puoi cambiare e ottenere il valore da un servizio remoto, ma le applicazioni che utilizzano l'API non devono saperlo.

Questo è un progetto fattibile per i campi di public final nelle classi immutable .

Da Java efficace :

Item 14: In public classes, use accessor methods, not public fields

...if a class is package-private or is a private nested class, there is nothing inherently wrong with exposing its data fields. This approach generates less clutter than the accessor-method approach.

While it's never a good idea for a public class to expose fields directly, it is less harmful if the fields are immutable.

Vedi anche Perché non dovrei usare POJO immutabili invece di JavaBeans?

    
risposta data 21.02.2011 - 19:54
fonte
9

L'uso delle coppie metodo get / set è il tragico difetto del design storico. Non riesco a pensare a un altro linguaggio che implementa le proprietà in modo verbale e inefficiente.

    
risposta data 22.02.2011 - 06:07
fonte
5

Penso che i campi pubblici siano corretti per una classe che è essenzialmente un tipo di valore come un numero complesso o un punto, in cui la classe fa poco più di un gruppo di tipi primitivi insieme come una struttura in stile C e forse definisce alcuni operatori.

    
risposta data 21.02.2011 - 20:13
fonte
5

Per definire le costanti pubbliche è ancora utile. Per es.

public static final int DAYS_IN_WEEK = 7;

Tuttavia, preferisci comunque enum dove possibile. Per es.

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY 
}

Per simulare classi struct semplici è anche utile. Nessun motivo per creare un getter e setter per ogni campo, quando sono comunque tutti pubblici.

class Point
{
    public int x, y;
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
    
risposta data 21.02.2011 - 20:17
fonte
2

Prima che gli IDE diventassero diffusi, rendere pubblici tutti i tuoi campi era un potente strumento per creare rapidamente prototipi / dimostrazioni di concetti.

Al giorno d'oggi ci sono scarse scuse per usarli, quando puoi generare una coppia getter / setter con un clic del mouse.

    
risposta data 21.02.2011 - 20:12
fonte
2

Questo è soggettivo, ma la mia opinione è che l'intera nozione pubblica / privata è obsoleta e arretrata.

In python non c'è pubblico / privato; tutto è fondamentalmente pubblico. Non ha causato molti problemi.

In Java si tende a creare getter / setter inutili per ogni campo per evitare il peccato di contrassegnarli come "pubblici". (IMHO se ti accorgi di farlo dovresti contrassegnarli come pubblici).

    
risposta data 22.02.2011 - 07:04
fonte

Leggi altre domande sui tag