Ultimo aggiornamento:  26 Febbraio 2024

 Stato del documento:   revisione in atto


team skill Visione d'insieme base advanced
PERCORSO BASE

JAVA ⮊ FONDAMENTALI


Visione d'insieme ( coding in Java )

java knowledge language

"Bias" cosa sono ?

  1. il termine euristica, indica il modo in cui il nostro cervello può trovare una soluzione a problemi complessi ricorrendo a delle "scorciatoie"

    1. euristica della disponibilità: quando prendiamo una decisione, spesso ci basiamo su singoli episodi e non su statistiche oggettive
    2. euristica dell’ancoraggio: tendiamo a fare scelte e valutazioni in base a esperienze precedenti relative a quella stessa circostanza, trascurando dati e circostanze contingenti che potrebbero portare a conclusioni diverse
    3. euristica della rappresentatività: è una scorciatoia mentale che utilizza la somiglianza tra elementi o categorie ( stereotipi ) per formulare valutazioni
  2. i bias cognitivi sono valutazioni errate della realtà, pensieri che formuliamo in automatico senza “razionalità”

    1. fattori d'amplificazione sulla valutazione : tempo, costi ( vincoli )
    2. fattori di classificazione sull'informazione : dare un senso, come filtrare, cosa ricordare, come agire
La peggiore pratica è iniziare i primi passi nell'arte della programmazione con un #bias d'ancoraggio offerto dal più elementare #snippets come codice d'esempio per il beginner
public class Gfg 
{ 
	public static void main ( String[] args ) { 
		System.out.println( "GFG!" ); 
	}
}
L'attenzione viene dirottata sulla struttura di un linguaggio o meglio su come e non sul cosa riesce a creare.


Sarebbe necessario invece porre un approccio meticoloso sullo stato e sul comportamento del requisito da progettare.

bias oop
Avere quindi una visione tridimensionale:

  1. la struttura: strumenti elementari orientati alla modellazione di un flusso
  2. la generalizzazione: strumenti avanzati orientati alla modellazione delle parti di un processo ( comportamento , complessità , algoritmo )
  3. lo scenario: strumenti specializzati nella descrizione di un meccanismo inteso come insieme di processi


✓   Fallace logiche: macro-gruppi

bias macro gruppi

formazione java e piattaforma Galileo


✓   Strumenti di produttività : promuovere il pensiero critico durante il brainstorming ( sticker telegram )

bias appello autorita anonima
bias appello autorita
bias appello pratica comune
bias appello ignoranza
bias appello incredulita
bias appello soldi
bias appello novita
bias appello maggioranza
bias appello probabilita
bias appello tradizione
bias appello conseguenze
bias appello adulazione
bias appello paura
bias appello natura
bias appello pieta
bias appello ridicolo
bias appello odio
bias appello desiderio
bias prova anedotica
bias composizione
bias divisione
bias fallacia scommettitore
bias generalizzazione affrettata
bias saltare conclusioni
bias compromesso
bias fallacia perfezionista
bias fallacia relativista
bias generalizzazione estesa
bias distribuzione termine medio
bias salvataggio ad hoc
bias_risposta premessa
bias generalizzazione interessata
bias_conferma_pregiudizio
bias falso dilemma
bias bugia
bias dettaglio ingannevole
bias_depistaggio
bias effetto valanga
bias nascondere prove
bias indimostrabilita
bias fallacia inverso
bias logica circolare
bias_contemporaneita_casualita
bias evincere unica causa
bias ignorare causa comune
bias posteriorita casualita
bias due cose una giusta
bias attacco personale
bias scaricabile
bias appello interesse personale
bias fallacia genetica
bias colpevole associazione
bias spaventapasseri


Concetti alla base del linguaggio


✓  Classe

E' un modello che descrive lo stato e il comportamento associato alla sue istanze ( oggetti )

Un'automobile è un oggetto che ha:

  1. stato marca, colore, targa
  2. comportamento transitare nella corsia stradale
java terminologia base ✓  Metodo

Il comportamento di un oggetto è codificato nei metodi

l'indicatore del carburante segnala autonomia rimasta nell'auto
✓  Variabili d'istanza

Ogni oggetto ha il suo set unico di variabili. Lo stato di un oggetto corrisponde ai valori assegnati a queste variabili

✓  Progettazione

Osservando lo stato bisogna porre attenzione :

  1. Visibilità

    "cosa" il progettista attribuisce a uno sviluppo privato , pubblico o protetto ( in fase di consolidamento )
  2. Tipo di dato

    "come" le informazioni che codificano il nostro scenario sono rappresentate dal linguaggio. Sono thread-safe ? E' importante un ordine d'inserimento ? Devono soddisfare criteri di ricerca ?
    1. primitivo spazio in memoria con n byte fissi

    2. // public è la visibilità
      // int è un tipo di dato primitivo 
      // con valori da -231 a 231-1 ( incluso ) 
      // count è un identificatore
      
      // dichiarazione variabile d'istanza
      public int count;
    3. classe ( tipo di dato strutturato ) spazio in memoria di * byte dinamico

      // private è la visibilità
      // String è un tipo di dato strutturato
      // docs.oracle.com - Class String																								
      // text è un identificatore
      
      // dichiarazione variabile d'istanza
      private String text;
      1. classe immutabile lo stato dell'istanza non è modificabile, ma l'istanza può essere ri-assegnata
      2. classe mutabile lo stato dell'istanza può essere modificato


Trail: Learning the Java Language Java® Platform, SE & JDK Version 15 API Specification

car object
Osservando il comportamento bisogna porre attenzione :

  1. Assegnazione di una variabile

    "come" le informazioni che codificano il nostro scenario sono attraversate, modificate e copiate in profondità
    // = è il simbolo di assegnazione
    // accesso fisico in memoria a una sequenza di byte fissa
    count = 1;  
    
    // sequenza di valori ordinati per inserimento
    // accesso per riferimento
    int[] arrayOfPrimeNum = { 1, 2, 3 };
  2. Accesso a una variabile

    java memory allocation
    1. spazio fisico l'identificatore punta a un indirizzo in memoria che contiene un tipo di dato primitivo ( a lunghezza fissa ) o strutturato ( a lunghezza dinamica )

    2. per riferimento l'identificatore punta all'indirizzo in memoria di un identificatore dello stesso tipo ( copia del indirizzo puntato )

      // accesso per riferimento
      int[] arrayOfPrimeNum = { 1, 2, 3 };
      int[] arrayReference = arrayOfPrimeNum;
    3. Quando una variabile d'istanza viene passata a un metodo come parametro:

      1. se il tipo di dato è primitivo il parametro è una copia del contenuto dell'indirizzo puntato
      2. se il tipo di dato è strutturato il parametro è una copia dell'indirizzo puntato ( passaggio per riferimento )
Se invece consideriamo OOP su concetti di astrazione, ereditarietà, incapsulamento e polimorfismo, spostiamo l'attenzione sul "cosa" è necessario orientare la progettazione per segmentare la complessità.


✓   Strumenti di produttività : promuovere il pensiero critico durante la progettazione ( @carlottamondelli instagram )

mindsets

Documentazione API

Notazione Ungherese

Era usata in passato per il controllo dei tipi in linguaggi poco tipizzati. Veniva aggiunto al nome dell'identificatore il tipo d'appartenenza nella dichiarazione della variabile.
String stringAccount;   // irrilevante
Notazione standard

✓  Nome del file sorgente

corrisponde esattamente all'identificatore della classe pubblica con l'estensione .java

  1. Gfg.java   // valido
  2. gfg.java   // invalido
public class Gfg { public static void main ( String[] args ) { System.out.println( "GFG!" ); } }
✓  Identificatori

Sono nomi di:

  1. package
  2. classi
  3. attributi-membro di classe
  4. istanze
  5. variabili d'istanza
  6. variabili locali
  7. metodi-membro di classe
Tutti i caratteri Unicode sono validi, non solo il sotto-insieme ASCII.


✓  Identificatori di classe

la prima lettera della classe deve essere in maiuscolo ( è permesso minuscolo, ma scoraggiato )

se si usano più parole per formare il nome della classe, la prima lettera di ogni parola interna deve essere in maiuscolo. Le sottolineature sono consentite, ma non raccomandate. Sono ammessi anche numeri e simboli di valuta, anche se quest'ultimi sono scoraggiati, perché sono utilizzati come notazione per le classi interne e anonime.

  1. MioJavaProgram   // sintassi valida
  2. 1Program      // sintassi invalida
  3. Mio1Program    // sintassi valida
  4. $Program      // sintassi valida, ma scoraggiata
  5. Mio$Program    // sintassi valida, ma scoraggiata ( inner class )
  6. mioJavaProgram   // sintassi valida, ma scoraggiata
✓  Identificatori di variabile d'istanza , attributo-membro di classe, variabile locale , metodo-membro di classe

tutti gli identificatori possono iniziare con una lettera, un simbolo di valuta o un segno di sottolineatura ( _ ). Secondo la convenzione, il primo carattere dovrebbe essere minuscolo.

il primo carattere di un identificatore può essere seguito da qualsiasi combinazione di:

  1. lettere
  2. cifre
  3. simboli di valuta
  4. sottolineatura
se si usano più parole, la prima lettera di ogni parola interna deve essere in maiuscolo

→ la sottolineatura non è raccomandata per i nomi delle variabili

→ una parola chiave non può essere usata come identificatore

  1. MinNumero    // sintassi scoraggiata
  2. alphaNum     // sintassi valida
  3. ciao_mondo    // sintassi scoraggiata
  4. $importo     // sintassi valida
  5. ak74       // sintassi valida
  6. _peso_valore   // sintassi scoraggiata
  7. 67ak       // sintassi invalida
  8. -importo     // sintassi invalida
Le costanti ( contrassegnate con le parole chiave final ed enum ) dovrebbero essere in tutte le lettere maiuscole.

Pianificazione di un indicatore

clean code
« Dobbiamo creare un ambiente evolutivo nel quale i paesi e le istituzioni possano crescere; in questo modo potremo risolvere i problemi a mano a mano che si presentano, unire attorno all'idea di come l'intelligenza collettiva possa trovare le soluzioni ai problemi del pianeta. Mettere insieme ! » [ Douglas Engelbart ]


✓  Come scelgo un nome per una variabile best practices

  1. Usare nomi parlanti esplicitano il contesto del codice

    Perchè esiste ?
    Cosa fà ?
    Come viene usata ?
    int i;             // ambiguo
    int countAccount   // parlante
    
  2. Usare distinzioni sensate:

    1. la denominazione numerica ( a1, a2, ... aN ) non solo è disinformativa, ma è del tutto non informativa

      public byte add( byte p1, byte p2 ) {...}                  // ambiguo
      public byte add( byte property, byte propertyOther ) {...} // parlante
    2. le parole di disurbo sono ridondanti

      class Product                // parlante
      class ProductData { ... }    // ambiguo
      class ProductInfo { ... }    // ambiguo


  1. Evitare nomi dai significati ambigui

    Account[] listAccount;   // ambiguo ( l'identificatore non è una lista )
    Account[] accountGroup   // parlante
  2. Evitare nomi con leggere differenze

    String[] pathAccountInSystem;         // ambiguo
    File[] pathAccountOutSystem;          // ambiguo
    String[] physicalPathAccountSystem;   // parlante
    File[] logicPathAccountSystem         // parlante
  3. Usare nomi pronunciabili nel linguaggio naturale

    String[] phyPathAccInSys;             // ambiguo
    String[] physicalPathAccountSystem    // parlante
    
  4. Usare nomi lunghi invece dei mono-lettera sono facilmente ricercabili

  5. Usare nomi mono-lettera solo nei cicli come variabile locale di servizio

  6. Aggiungere un contesto significativo adottando l'uso di prefissi

    String state        // ambiguo
    String addrState    // parlante
    

formazione java e piattaforma Galileo


✓   Strumenti di produttività : promuovere il pensiero critico durante la progettazione ( @carlottamondelli instagram )

maslow

JavaDoc


E' un tool generatore di documentazione standard in formato HTML.

Genera documentazione API, risultato del parser su speciali tag, contenuti nei commenti del codice sorgente, a corredo di:

  1. Package
  2. Classi
  3. Attributi-Membro di classe
  4. Interfacce
  5. Costruttori
  6. Metodi-Membro di classe
oracle.com - Requirements for Writing Java API Specifications

✓  Ordine dei tag

  1. @author
  2. @version
  3. @param
  4. @return
  5. @throws
  6. @see
  7. @since
  8. @serial
  9. @deprecated
docs.oracle.com - Documentation Comment Specification for the Standard Doclet ( JDK 15 ) docs.oracle.com - The Java API Documentation Generator docs.oracle.com - How to Write Doc Comments for the Javadoc Tool texteditor.com - ASCII to HTML Conversion

Esempio: documentazione di una classe
/**
 * La classe genera degli identificatori casuali.
 * Ulteriori informazioni {@link org.buscati.knowledge.example}
 * 
 * @author itammb ( Italia Massimiliano Buscati )
 * @version JDK 1.15 
 */
 
 public class Example_001_JavaDoc { ... }
Esempio: documentazione di un attributo-membro di classe
/**
 * Formato: anno-mese-giorno.ora.minuti.secondi.millisecondi
 */
 
public final static String PATTERN_DATETIME = "yyyy-MM-dd.hh.mm.ss.SSS";
Esempio: documentazione di un metodo
/**
 * @return Sequenza temporale alfanumerica 
 * 
 * @throws InterruptedException
 * 
 * @see Locale
 * @see SimpleDateFormat
 * @see buscati.org
 * 
 * @since JDK 1.15
 */
 
public synchronized String timeUnique() throws InterruptedException { 
... }

Tag Visibilità Descrizione
@author name-text package, classi, interfacce identifica → l'autore del codice sorgente
@version version-text package, classi, interfacce
  1. contrassegna la versione della JVM di rilascio del progetto
  2. specifica la versione corrente a cui fà riferimento il codice sorgente nel file *.java
@since since-text package, classi, interfacce, costruttori, metodi-membro di classe, attributi-membro di classe descrive quando una modifica o una funzionalità viene codificata per la prima volta

si deve specificare un tag @since:

  1. quando si introduce un nuovo package

    1. nella descrizione del package
    2. in ciascuna delle sue classi
  2. quando si aggiunge una nuova classe o interfaccia

    1. nella descrizione della classe, non nella descrizione dei suoi membri
  3. se si aggiungono nuovi membri a una classe esistente

    1. solo per i membri appena aggiunti
  4. se si cambia un attributo-membro della classe da protected a public, non si deve cambiare il tag @since
@param
  1. parameter-name description
  2. <type-parameter-name> description
costruttori, metodi-membro di classe identifica → uno dei parametri di un metodo
@return description-text metodo descrivere il tipo di ritorno e la gamma di valori consentiti
{@value package.class#field} package, classi, interfacce, costruttori, metodi-membro di classe, attributi-membro di classe visualizza il valore di una costante
@throws
  1. class-name
  2. description
costruttori, metodi-membro di classe è usato per spiegare ulteriormente, i casi in cui il codice genera un'eccezione
@see
  1. #field
  2. #Constructor(Type, Type...)
  3. #Constructor(Type id, Type id...)
  4. #method(Type, Type,...)
  5. #method(Type id, Type, id...)
  6. Class
  7. Class#field
  8. Class#Constructor(Type, Type...)
  9. Class#Constructor(Type id, Type id)
  10. Class#method(Type, Type,...)
  11. Class#method(Type id, Type id,...)
  12. package.Class
  13. package.Class#field
  14. package.Class#Constructor(Type, Type...)
  15. package.Class#Constructor(Type id, Type id)
  16. package.Class#method(Type, Type,...)
  17. package.Class#method(Type id, Type, id)
  18. package
package, classi, interfacce, costruttori, metodi-membro di classe, attributi-membro di classe fornisce un riferimento nella sezione "vedi anche"
{@link} package, classi, interfacce, costruttori, metodi-membro di classe, attributi-membro di classe fornisce un link simile al tag @see. Entrambi i tag richiedono gli stessi riferimenti e accettano la stessa sintassi e label. La differenza principale è che il tag {@link}, genera un collegamento in linea, anziché inserire il collegamento nella sezione "vedi anche"
@serial
  1. field-description
  2. include
  3. exclude
package, classi, interfacce, attributi-membro di classe
    .
  1. se un campo serializzabile è stato aggiunto a una classe, dopo che questa è stata resa serializzabile, si deve aggiungere un field-description per specificare da quale versione

  2. una classe pubblica o protetta che implementa Serializable, è inclusa nella documentazione API, a meno che tale classe ( o il suo package ) non sia contrassegnata dal tag @serial exclude

  3. una classe privata che implementa Serializable è esclusa dalla documentazione API, a meno che tale classe ( o il suo package ) non sia contrassegnata dal tag @serial include
@SuppressWarnings
  1. ({"unchecked", "deprecation"})
classi, interfacce, costruttori, metodi-membro di classe, attributi-membro di classe specifica che gli avvisi del compilatore devono essere soppressi
@deprecated deprecated-text classi, interfacce, costruttori, metodi-membro di classe, attributi-membro di classe specifica → che il codice sorgente particolare non deve essere utilizzato ( anche se può continuare a funzionare )
{@code text } package, classi, interfacce, costruttori, metodi-membro di classe, attributi-membro di classe visualizza un codice sorgente senza interpretare il testo come markup HTML o tag Javadoc. Non mantiene la formattazione del testo


✓  Requisiti di un un commento performante best practices

  1. Essere esplicativi nel codice è preferibile a qualsiasi commento

    // controlla se un dipendente ha diritto al bonus per intero
    
    if (employee.flagBonus && employee.yearsOfWork > 10 );  // ambiguo
    if (employee.isEligibleForFullBenefits());              // parlante
  2. Adoperare commenti informativi:

    /**
     * Formato: anno-mese-giorno.ora.minuti.secondi.millisecondi
     */
    public final static String PATTERN_DATETIME = "yyyy-MM-dd.hh.mm.ss.SSS";
    
  3. Lasciare commenti su sezioni di codice in divenire nello sviluppo

  1. Adoperare commenti descrittivi

    public synchronized static int isAvailableBufferMemory() {				
      RUNTIME.gc();
    		 
      double jvmFM = Long.valueOf(RUNTIME.freeMemory()).doubleValue();
      double bufSize = jvmFM * PERC_USAGE_MEMORY;
      
      // data una %_ di utilizzo della memoria 
      // restituisce la dimensione del buffer allocabile più grande
      return Double.valueOf(bufSize).intValue();
    }
  2. Usare commenti per amplificantare o chiarire l'importanza del codice

    public synchronized static long jvmFreeMemory() {	
      long jvmUM = jvmUsedMemory();
    	
      // memoria disponibile in bytes 	
      return RUNTIME.maxMemory() - jvmUM; 	
    }


Esempio: documentazione API di un programma

naviga API compila il codice


Workaround: come configurare l'ambiente Eclipse IDE per generare documentazione API


Workaround: come creare una documentazione API in ambiente Eclipse IDE

Annotations


Le annotazioni vengono utilizzate per fornire informazioni supplementari dentro il codice sorgente:

  1. iniziano con '@'
  2. non modificano la logica del codice
  3. associano metadati (informazioni) a variabili d'istanza, costruttori, metodi e classi
  4. possono modificare il modo in cui un programma viene trattato dal compilatore
  5. servono a fornire informazioni aggiuntive in alternativa a XML e ai marker Java
✓   General Purpose-Annotations ( predefinite )

  1. marcano una dichiarazione
  2. non contengono parametri e non consistono in alcun dato
  3. è sufficiente determinare se il marcatore è presente o assente
@Override
public String toString() 
{
  Print print = new Print();
		
  print.add("absolute path", absolute_path);
  print.add("time to log  ", getWishSCHEDULE_AT_FIXED_RATE_LOG());
				
  return print.toString( Log.class.getName() );
}
docs.oracle.com - Annotations

✓   Meta-Annotations ( con parametri )

  1. @Target specifica il tipo d'elemento a cui applicare l'annotazione

    Parametro Visibilità
    TYPE Classe, interfaccia, tipo-enumerazione
    FIELD Attributo-membro di classe
    METHOD Metodo-membro di classe
    CONSTRUCTOR Costuttore
    LOCAL_VARIABLE Variabile locale
    ANNOTATION_TYPE Tipo-annotazione
    PARAMETER Parametri
    docs.oracle.com - Enum ElementType

  2. @Retention specifica a quale livello sarà disponibile l'annotazione

    Parametro Visibilità
    SOURCE solo nel codice sorgente
    CLASS solo nel *.class
    RUNTIME disponibile nel *.class e alla JVM ( in fase di run-time )
    docs.oracle.com - Enum RetentionPolicy

  3. @Inherited indica che l'annotazione può essere ereditata dalle sotto-classi. Per impostazione predefinita, le annotazioni non lo sono

  4. @Documented contrassegna l'annotazione per l'inclusione nella documentazione


Java Annotations docs.oracle.com - Package java.lang.annotation docs.oracle.com - Package java.lang.reflect

✓   Custom-Annotations ( personalizzate )

  1. @interface viene utilizzato per dichiarare un'annotazione
  2. non ha clausole throws
  3. deve restituire un tipo primitivo, String, Class, enum o array di questi tipi
  4. non ha alcun parametro
  5. è possibile assegnare un valore predefinito
// marker Annotation 
@interface MyAnnotation{ ... }
// dichiarazione di un annotazione 
public @interface Source {
  String autore() default "Pinco Pallino"; // valori predefiniti 
  double versione() default 0;
}

// assegnazione valori	
@Source( autore = "Massimiliano Buscati", versione = 1.1 ) 
public class TestClass { ... }


Esempio: dichiarazione, assegnazione e navigazione di custom-annotations

docs.oracle.com - Package java.lang.annotation docs.oracle.com - Package java.lang.reflect compila il codice

Struttura di un programma


✓   Case-sensitivity

Java è un linguaggio case-sensitive l'identificatore con nome AB, per la JVM, è diverso dal identificatore contrassegnato come Ab, aB o ab

System.out.println("Alice");  // sintassi validasystem.out.println("Alice");  // sintassi con errore
Il metodo main() è il punto d'ingresso principale, in un programma.
E' il punto dove inizia l'elaborazione.

 public static void main(String [] args)


✓   Keywords

  1. vengono utilizzate per processi interni o azioni predefinite
  2. non possono essere usate come nome d'identificatore o di classe
.
package import
const boolean enum byte long char float short double
final static abstract synchronized default
private public protected transient volatile
interface class extends implements
instanceof new this super
if else switch for do while continue break return
assert try finally catch throw throws

Formattazione di una classe ( dove metti cosa )


best practices La variabile deve essere dichiarata:

  1. se d'istanza in cima alla classe
  2. se costante o enumerazione in cima alla classe
  3. se locale vicino al codice che la manipola
    1. se di controllo nell'istruzione del ciclo
    2. se subordinata in cima a un blocco
La funzione deve essere dichiarata:

  1. se principale sopra le subordinate
  2. se affine ad altre raggruppate nello stesso posto
  3. se costruttore sotto le variabili d'istanza


Quando si sviluppa un codice:

  1. le variabili d'istanza sono inizialmente private ( anche final ) ma possono passare a protected
  2. le costanti e le enumerazioni sono sempre static e public
  3. le funzioni principali sono sempre public o protected e static ( se appartenenti alla classe )
  4. le funzioni subbordinate sono sempre private e static ( se appartenenti alla classe )
Esempio: formattazione di una classe
public class Skeleton {

 // → costanti ed enumerazioni 
 // → variabili d'istanza
 // → metodi cotruttore
 // → funzioni principali
 // → funzioni subordinate

 // → funzioni affini principali o subordinate 
}


Esempio: formattazione di una classe -dove metto cosa- ( eliminazione spazzi bianchi duplicati da un testo )

best practices Disegnare uno scenario aumenta la visione delle possibili soluzioni in fase di progettazione e migliora il codice che descrive la soluzione, durante lo sviluppo.

docs.oracle.com - Class Character docs.oracle.com - Class String docs.oracle.com - Class StringBuffer compila il codice


Esempio: formattazione di una classe -dove metto cosa- ( ricerca di una parola )

docs.oracle.com - Interface Comparable docs.oracle.com - Class AbstractMap.SimpleEntry<K,​V> compila il codice

Dichiarazione di variabili: locali, d'istanza, statiche


✓   Variabili locali

Sono definite all'interno di un blocco, di un metodo o un costruttore.

  1. vengono create quando si entra nel blocco o quando il metodo viene chiamato
  2. sono distrutte dopo l'uscita dal blocco o quando la chiamata ritorna dal metodo
  3. lo scope di queste variabili esiste solo all'interno del blocco in cui vengono dichiarate
  4. l'inizializzazione è obbligatoria
✓   Variabili d'istanza

Sono variabili non statiche e sono dichiarate in una classe, al di fuori di qualsiasi metodo, costruttore o blocco.

  1. vengono create quando si istanzia una classe
  2. vengono distrutte quando l'istanza viene distrutta
  3. a differenza delle variabili locali, si può assegnare un access-specifier ( se non esplicito per default ne viene associato uno predefinito )
  4. l'inizializzazione non è obbligatoria
  5. hanno valore predefinito 0 o null
  6. è possibile accedervi, solo creando un oggetto

    Object-Type obj = new Object-Type();


✓   Variabili statiche

Sono anche conosciute come attributi-membro di classe.

  1. sono dichiarate usando la parola chiave static all'interno di una classe, al di fuori di qualsiasi costruttore o blocco di metodo
  2. vengono create durante la compilazione e distrutte automaticamente al termine dell'esecuzione
  3. l'inizializzazione non è obbligatoria
  4. hanno valore predefinito 0 o null
  5. se si accede alla variabile statica senza il nome della classe, il compilatore aggiungerà automaticamente il riferimento alla classe
A differenza delle variabili d'istanza, possiamo avere per classe, solo una copia di una variabile statica, indipendentemente da quanti oggetti creiamo.

✓   Differenze tra variabile d'istanza e variabili statiche

  1. le modifiche apportate a una variabile d'istanza, non saranno riflesse in altri oggetti, poiché ogni oggetto ha la propria copia della variabile
  2. le modifiche apportate a una variabile statica, saranno riflesse in altri oggetti, poiché le variabili statiche sono comuni a tutti gli oggetti di una classe
  3. possiamo accedere alle variabili d'istanza tramite riferimenti ad oggetti
  4. possiamo accedere alle variabili statiche direttamente usando il nome della classe

Visibilità e modificatori d'acceso ( scope )

java scope


✓   Accesso a un metodo

Classe-padre Package Classe-figlia
public Yes Yes
protected No Yes
private No No
  1. le parentesi graffe {  ...  } definiscono un ambito
  2. l'accesso a una variabile è subordinato al codice definito in quel ambito
  3. qualsiasi variabile definita in una classe, al di fuori di qualsiasi metodo, può essere utilizzata da tutti i metodi membro di quella classe
  4. la parola chiave this, può essere usata per fare riferimento a una variabile d'istanza

    public class Scope {
      private int primitiveNum;
      public Scope(int primitiveNum) {
        this.primitiveNum = primitiveNum;
      }
    }
  5. la variabile a cui si accede, all'interno di un ciclo, deve essere dichiarata e inizializzata prima del corpo del ciclo


Esempio: visibilità di una variabile d'istanza e locale ( dentro un metodo )

compila il codice


Esempio: visibilità di una variabile d'istanza e locale ( dentro un blocco )

compila il codice


Esempio: visibilità ( implicita ) di una variabile d'istanza attraverso i metodi get / set

compila il codice

formazione java e piattaforma Galileo

Riferimenti

  1. Protocolli

    IEEE 754 Character Sets datatracker.ietf.org - RFC 4647 "Matching of Language Tags" datatracker.ietf.org - RFC 5646 "Tags for Identifying Languages"

  2. Java documentazione

    bugs.java.com - Java Bug Database JDK 15 Documentation Version 15 API Specification Java Core Libraries Java Tutorials Learning Paths docs.oracle.com - Documentation Comment Specification for the Standard Doclet ( JDK 15 ) docs.oracle.com - How to Write Doc Comments for the Javadoc Tool docs.oracle.com - Documentation Comment Specification for the Standard Doclet ( JDK 15 ) docs.oracle.com - The Java API Documentation Generator docs.oracle.com - How to Write Doc Comments for the Javadoc Tool oracle.com - Requirements for Writing Java API Specifications docs.oracle.com - Package java.lang.annotation docs.oracle.com - Package java.lang.reflect

  3. Modulo → java.base : : Package → java.lang

    docs.oracle.com - Class Character docs.oracle.com - Class String docs.oracle.com - Class StringBuffer docs.oracle.com - Interface Comparable docs.oracle.com - Class Math docs.oracle.com - Class Integer docs.oracle.com - Class Long docs.oracle.com - Class Float docs.oracle.com - Class Double docs.oracle.com - Class Array docs.oracle.com - Interface Cloneable docs.oracle.com - Class Exception docs.oracle.com - Class AssertionError

  4. Modulo → java.base : : Package → java.util

    docs.oracle.com - Class AbstractMap.SimpleEntry<K,​V> docs.oracle.com - Class Arrays

  5. UML slide

    dmi.unict.it - Emiliano Tramontana

  6. Bias

    unobravo.com - bias cognitivi: cosa sono valerio.it - bias cognitivi: cosa sono efficacemente.com - bias cognitivi: cosa sono rentalblog.it - effetto ancoraggio rentalblog.it - euristica della disponibilita rentalblog.it - effetto gregge rentalblog.it - errore di rinforzo delle scelte rentalblog.it - pregiudizio di conferma rentalblog.it - fallacia dello scommettitore rentalblog.it - pregiudizio sullo status-quo rentalblog.it - effetto dotazione medicinaonline.co - clustering illusion rentalblog.it - effetto framing

  7. Algoritmi

    Funzione di hash

  8. Tutorial

    docs.oracle.com - The Java™ Tutorial - Annotations docs.oracle.com - Arrays and Enumerated Types docs.oracle.com - The Java™ Tutorial - Operators docs.oracle.com - The Java™ Tutorial - Control Flow Statements geeksforgeeks.org - Java Programming Language geeksforgeeks.org - java.lang package in Java geeksforgeeks.org - Annotations in Java geeksforgeeks.org - Static class in Java geeksforgeeks.org - final Keyword in Java geeksforgeeks.org - Access and Non Access Modifiers in Java geeksforgeeks.org - Java Basic Syntax geeksforgeeks.org - Variables in Java geeksforgeeks.org - Scope of Variables In Java geeksforgeeks.org - Data types in Java geeksforgeeks.org - Rounding off errors in Java geeksforgeeks.org - Operators in Java geeksforgeeks.org - foreach() loop vs Stream foreach() geeksforgeeks.org - Exceptions in Java geeksforgeeks.org - Object Oriented Programming geeksforgeeks.org - Private Constructors and Singleton Classes geeksforgeeks.org - Inner Class geeksforgeeks.org - Functional Interfaces geeksforgeeks.org - Comparator Interface careydevelopment.us - Java 8: How to Use forEach With Lambda Expressions java2s.com - java.lang java2s.com - String Example lia.disi.unibo.it - Una Rapida Parentesi su Java 5 e Annotazioni demo2s.com - Java / Annotations stackoverflow.com - Arrays.asList() of an array baeldung.com - How to Round a Number to N Decimal Places in Java baeldung.com - Using Java Assertions w3schools.com - Java Data Types howtodoinjava.com - Java Data Types tabnine.com - How to use java.math.BigDecimal

  9. Bibliografia

    docstore.mik.ua - The java.lang Package docstore.mik.ua - The java.text Package
    Acquisto consigliatoTitolo: Clean Code, Autore: Robert C. Martin, Casa Editrice: Apogeo