DOMANDA Creare una classe personalizzabile per poter inserire tipi diversi di oggetti in un array in java

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
Salve a tutti,
so che il titolo è lungo e confusionario, quindi cercherò di spiegarmi meglio.
Per un progettino che sto facendo ho bisogno di utilizzare i tuples, che ovviamente in java non ci sono. Quindi piuttosto che reinventare la ruota potrei cercare qualcosa di simile già fatto.
Beh, no. Siccome sto ancora imparando ho deciso di rifarli da capo io stesso. E oltre al problema della ridimensionabilità (che potrei risolvere con un arraylist, ma credo che farò da solo anche quello) c'è il problema dell'usare più tipi di dato nello stesso array. Quindi mi è venuta l'idea di creare una classe "personalizzabile", cioè che tu crei un'istanza di quella classe passi come attributi una costante statica della classe personalizzabile e una stringa come valore, che poi la classe convertirebbe nel tipo opportuno.
Ciò che mi perplime è la struttura ben definita, perché questa è solo un'idea generale, magari anche errata, e mi piacerebbe un parere da chi è più esperto
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,946
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
oltre al problema della ridimensionabilità (che potrei risolvere con un arraylist, ma credo che farò da solo anche quello)
idea peggio che pessima: inutile reinventare la ruota, usa ArrayList, se vuoi fare le cose da zero usa il C
Quindi mi è venuta l'idea di creare una classe "personalizzabile", cioè che tu crei un'istanza di quella classe passi come attributi una costante statica della classe personalizzabile e una stringa come valore, che poi la classe convertirebbe nel tipo opportuno
mah! mi pare cervellotico
per definire una banalisima tupla ti basta creare una classe che come attributi abbia un array da inizializzare col numero di elementi che deve contenere la tupla
non sapendo a priori il "tipo" di elementi che deve contenere l'array, puoi definirli semplicemente come Object (più generici di così si muore) e le operazioni devi farle previa conversione di classe con l'operatore ()

Java:
class Tupla {
    final int k; // n. di elementi della tupla da inizializzare nel costruttore e non più modificabile in seguito essendo final
    Object[] items;

    // costruttore
    Tupla(int n){
        int k = n;
        items = new Object[n];
    }

    // resto del codice
}

in realtà, se devo dirla tutta, non hai proprio definito adeguatamente il problema, in altri termini non si capisce cosa vuoi fare esattamente (o perlomeno non l'ho capito io)
 

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
idea peggio che pessima: inutile reinventare la ruota, usa ArrayList, se vuoi fare le cose da zero usa il C
col C non ho abbastanza confidenza, passerei metà del tempo a cercare la sintassi e come usarla. Poi volevo reinventare la ruota proprio per imparare meglio java

idea peggio che pessima: inutile reinventare la ruota, usa ArrayList, se vuoi fare le cose da zero usa il C

mah! mi pare cervellotico
per definire una banalisima tupla ti basta creare una classe che come attributi abbia un array da inizializzare col numero di elementi che deve contenere la tupla
quindi così potrei mettere qualsiasi tipo di oggetto? anche una stringa e un int nello stesso array?

non sapendo a priori il "tipo" di elementi che deve contenere l'array, puoi definirli semplicemente come Object (più generici di così si muore) e le operazioni devi farle previa conversione di classe con l'operatore ()

Java:
class Tupla {
    final int k; // n. di elementi della tupla da inizializzare nel costruttore e non più modificabile in seguito essendo final
    Object[] items;

    // costruttore
    Tupla(int n){
        int k = n;
        items = new Object[n];
    }

    // resto del codice
}
Ah ok, sarebbe anche più veloce effettivamente. (che strano, nella risposta ho un code che l'originale non ha)

in realtà, se devo dirla tutta, non hai proprio definito adeguatamente il problema, in altri termini non si capisce cosa vuoi fare esattamente (o perlomeno non l'ho capito io)
è perché non l'ho capito neanchio per bene
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,946
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Poi volevo reinventare la ruota proprio per imparare meglio java
ti assicuro che non è così che lo imparerai: impari Java conoscendo le classi predefinite di sistema e quello che ti offrono
quindi così potrei mettere qualsiasi tipo di oggetto? anche una stringa e un int nello stesso array?
attenzione:
in un array definito come nel codice sopra metti Object, gli oggetti più rarefatti possibile; gli interi int NON sono oggetti, in un array di quel genere ci puoi mettere un BigInteger che contine il valore di un int, che è una cosa differente
le stringhe invece sono oggetti e le puoi mettere ma è un pessimo modo di programmare mischiare i cavoli con la pastasciutta: idealmente una tupla è fatta da oggetti dello stesso tipo altrimenti non è una tupla
quindi l'idea è metterci o tutti BigInteger o tutte String ma a questo punto non è che serva definire una tupla ti basta un array di oggetti già definiti
c'è il problema dell'usare più tipi di dato nello stesso array
mi era sfuggito questo infatti: è una pessima idea perché significa che per ogni accesso ad un oggetto avresti il problema di identificarlo e di farci le operazioni giuste, una catastrofe prestazionale e una valanga di codice inutile da scrivere, tutto potenzialmente prono agli errori più impensabili run-time. Java in compilazione ti aiuta motlissimo ma devi usarlo con intelligenza
 
  • Mi piace
Reazioni: DispatchCode

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Ha senso reimplementare ArrayList solo se stai studiando le strutture dati, così capisci più nel concreto come funziona un array dinamico.

Considera che il Collection Framework è nato apposta per avere delle strutture dati generiche (fanno uso dei Generics) il cui tipo è definito quando compili. Questo per evitare il problema di Java 1.4 e inferiori dove invece potevi inserire qualsiasi tipo di oggetti dentro a una struttura dati.

Come dice BAT è una pessima pratica, e implementarlo non di darà competenze aggiuntive (al massimo capisci perché non va fatto e non lo fa più nessuno da una 15ina di anni minimo).
 
  • Mi piace
Reazioni: BAT

AlfredoCentinaro

Nuovo Utente
6
1
Secondo la mia umile opinione sei fuori strada, o meglio Java nasce come linguaggio con una forte connotazione di semplificare determinate strutture dati, sfruttare una vastità di librerie ed oggetti per ogni dove.

Se vuoi studiare le liste, gli arraylist sono comodi, conviene sputare sangue su c/c++ se vuoi approfondire l'argomento, in Java usi il concetto acquisito.Stessa cosa per le tuple, esiste la classe Object generica che fa per te, non devi reinvantare nulla secondo me.

Se ti vuoi spaccare un po' la testa, vai con la programmazione concorrente e thread. Ad esempio faccio questo a scuola con i miei alunni https://www.alfredocentinaro.it/lezioni/java/thread-java-impianto-di-produzione-schede-con-seriale/
Oppure comincia a lavorare sulle librerie esistenti, ad esempio sempre in classe i miei ragazzi li massacro sulla gestione delle date che nascondono le mille insidie della OOP: esempio qui https://www.alfredocentinaro.it/lezioni/java/la-gestione-delle-date-e-orario-in-java/
 
  • Mi piace
Reazioni: finmat92

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili