[Java] Beginnersvraagje: Array's

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo iedereen,


Ik heb volgend stukje code:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Werknemer {
    
    private final String WERKDAGEN[] = {"maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"};
    
    private int werknemerID;
    private String naam, voornaam;
    private boolean werkschema[];
    
    //De constructoren
    public Werknemer(int werknemerID, String naam, String voornaam, boolean werkschema[])
    {
        setWerknemerID(werknemerID);
        setNaam(naam);
        setVoornaam(voornaam);
        setWerkschema(werkschema);
    }



Maar dan heb ik nog een tweede constuctor en doe dit met de volgende syntax:

Java:
1
2
3
4
public Werknemer(int werknemerID)
    { 
        this(werknemerID, "", "", boolean werkschema[] = {false, false, false, false, false, false});
    }


Bij de laatste parameter krijg ik een syntax error... Ik heb al vanalles geprobeert maar dit lijkt me de beste oplossing?

Misschien kennen jullie de juiste methode?

Dank bij voorbaat, Mathias Lavaert

Acties:
  • 0 Henk 'm!

  • momania
  • Registratie: Mei 2000
  • Laatst online: 00:24

momania

iPhone 30! Bam!

Bij
Java:
1
private final String WERKDAGEN[] = {"maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"};

Staat eigenlijk:
Java:
1
private final String WERKDAGEN[] = new String[]{"maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"};


Nu moet je de juiste manier om je contructor parameter te initialiseren ook wel kunnen vinden denk ik ;)

Neem je whisky mee, is het te weinig... *zucht*


Acties:
  • 0 Henk 'm!

  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 11-09 10:19
Probeer dit eens:
code:
1
        this(werknemerID, "", "", boolean[] = {false, false, false, false, false, false});


@momania, hij heeft het over het boolean[] werkschema (iets onder werkdagen, ik verkeek me er ook op).

@HerrBohm, wel als je een array van T wilt meegeven en het op die plek pas wilt maken

[ Voor 43% gewijzigd door ThaStealth op 23-12-2009 16:18 ]

Mess with the best, die like the rest


Acties:
  • 0 Henk 'm!

Verwijderd

code:
1
2
3
4
public Werknemer(int werknemerID)
    { 
        this(werknemerID, "", "", {false, false, false, false, false, false});
    }


Je hoeft niet het datatype (boolean) mee te geven wanneer je een argument meegeeft aan een methode. Je zegt ook niet dit:
code:
1
this(int werknemerID 0, String iets1 "", String iets2 "");

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dit is natuurlijk erg basic, en gewoon onderdeel van de Java Syntax, en dus zou je eigenlijk het antwoord wel moeten kunnen vinden. Maar kijk voor de grap eens wat het verschil is bij de verschillende parameters!

Waarom geef je bij de eerste parameters niet het type, en de parameter naam mee, en bij de laatste wel?

edit:
\langzaam

[ Voor 3% gewijzigd door Woy op 23-12-2009 16:18 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
momania schreef op woensdag 23 december 2009 @ 16:15:
Bij
Java:
1
private final String WERKDAGEN[] = {"maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"};

Staat eigenlijk:
Java:
1
private final String WERKDAGEN[] = new String[]{"maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"};


Nu moet je de juiste manier om je contructor parameter te initialiseren ook wel kunnen vinden denk ik ;)
Prachtig, werkt perfect

Werkelijk bedankt

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Edit: damn te laat :/

@ThaStealth en HerrBohm, wtf dat is geen java syntax, zo initialiseer je toch geen object? Het is geen haskell waar je een apparte list syntax hebt. :)




[code]boolean werkschema[] = {false, false, false, false, false, false})[/code]
Klopt niet.

Wat je bedoelt:

[code=java]
boolean werkschema[] = new boolean[]{false,false,false... etc});
[/code]

Maar dit kun je ook vervangen door
[code=java]
new boolean[]{false,false....etc});
[/code]
Aangezien je geen naam hoeft te geven aan het object omdat je deze meteen doorsluist naar een methode/andere constructor.

Klein foutje, moet je net even zien. Succes!

[ Voor 17% gewijzigd door roy-t op 23-12-2009 16:20 ]

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • momania
  • Registratie: Mei 2000
  • Laatst online: 00:24

momania

iPhone 30! Bam!

Verwijderd schreef op woensdag 23 december 2009 @ 16:16:
code:
1
2
3
4
public Werknemer(int werknemerID)
    { 
        this(werknemerID, "", "", {false, false, false, false, false, false});
    }
Dat gaat niet werken... als parameter moet je expliciet een nieuwe array maken van het juiste type ;)

[edit]
Maar goed, ik had gehoopt dat met mijn eerste tip de TS dat zelf had kunnen uitvogelen, maar iedereen is het al weer aan het voorkauwen....

[ Voor 18% gewijzigd door momania op 23-12-2009 16:19 ]

Neem je whisky mee, is het te weinig... *zucht*


Acties:
  • 0 Henk 'm!

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Je kunt voor zover ik weet 'boolean werkschema =' gewoon weglaten. Dus op deze manier:

Java:
1
2
3
4
public Werknemer(int werknemerID) 
{  
    this(werknemerID, "", "", new boolean[]{false, false, false, false, false, false}); 
}

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
//Edit: Niet relevant

[ Voor 95% gewijzigd door Verwijderd op 23-12-2009 16:20 ]


Acties:
  • 0 Henk 'm!

Verwijderd

momania schreef op woensdag 23 december 2009 @ 16:18:
[...]

Dat gaat niet werken... als parameter moet je expliciet een nieuwe array maken van het juiste type ;)

[edit]
Maar goed, ik had gehoopt dat met mijn eerste tip de TS dat zelf had kunnen uitvogelen, maar iedereen is het al weer aan het voorkauwen....
Och tuurlijk, dat soort fouten maak ik wel weer nu het vakantie is :S

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 23 december 2009 @ 16:22:
[...]


Och tuurlijk, dat soort fouten maak ik wel weer nu het vakantie is :S
Lol, het was ook mijn eerste poging hoor!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nog een vraagje...

Als ik het aantal objecten die aangemaakt werden van deze klasse wil bijhouden...

Dan zal ik logischer wijs een tellertje toevoegen bij mijn constructoren: (aantal++;)

Maar hoe kan ik nu dat tellertje bijwerken als een van mijn objecten verwijderd werden?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
--> Oplossing al gevonden, methode finalize overriden

Acties:
  • 0 Henk 'm!

  • CAPSLOCK2000
  • Registratie: Februari 2003
  • Laatst online: 11-09 21:28

CAPSLOCK2000

zie teletekst pagina 888

Verwijderd schreef op woensdag 23 december 2009 @ 17:03:
--> Oplossing al gevonden, methode finalize overriden
Pas op! Finalize() is _geen_ destructor.
Er is _geen_ garantie dat finalize() ooit aangeroepen zal worden.

finalize() wordt door de Garbage Collector aangeroepen als die vindt dat het tijd is om op te ruimen (omdat je geheugen vol zit). Als je genoeg geheugen hebt zou dat wel eens nooit kunnen gebeuren.

Voor wat jij wil bestaat geen mooie Java oplossing. Je zal zelf expliciet een methode moeten aanroepen bij het verwijderen van een object.

This post is warranted for the full amount you paid me for it.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
CAPSLOCK2000 schreef op woensdag 23 december 2009 @ 17:50:
[...]


Pas op! Finalize() is _geen_ destructor.
Er is _geen_ garantie dat finalize() ooit aangeroepen zal worden.

finalize() wordt door de Garbage Collector aangeroepen als die vindt dat het tijd is om op te ruimen (omdat je geheugen vol zit). Als je genoeg geheugen hebt zou dat wel eens nooit kunnen gebeuren.

Voor wat jij wil bestaat geen mooie Java oplossing. Je zal zelf expliciet een methode moeten aanroepen bij het verwijderen van een object.
Dat de garbage collector niet automatisch aangeroepen zal worden vormt het probleem niet... die kun je toch handmatig aanroepen met System.gc()

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op woensdag 23 december 2009 @ 18:44:
Dat de garbage collector niet automatisch aangeroepen zal worden vormt het probleem niet... die kun je toch handmatig aanroepen met System.gc()
Denk je niet dat het dan verstandiger is om gewoon een eigen methode daarvoor te introduceren en die dan aan te roepen? Elke keer dat je object weg mag even de gc aanroepen zal niet heel best voor je performance zijn, en je krijgt alsnog geen harde garanties dat er gebeurt wat jij hoopt.

Als je het aantal levende objecten wilt weten en daar enige controle over wilt hebben, ben je wellicht sowieso beter af met een objectpool-constructie.

En als we dan toch tips aan het geven zijn, voor je array van dagen zou ik een enum gebruiken en dan voor je werkschema een EnumSet, zodat je altijd de garantie hebt dat je alleen de dagen krijgt die je wilt en bij je specificatie welke dagen er voor een werknemer bekend zijn ook niet ergens per ongeluk een array van 6 of 8 booleans kan krijgen.

[ Voor 8% gewijzigd door ACM op 23-12-2009 19:00 ]


Acties:
  • 0 Henk 'm!

  • Jegorex
  • Registratie: April 2004
  • Laatst online: 03-09 23:24
Verwijderd schreef op woensdag 23 december 2009 @ 18:44:
[...]


Dat de garbage collector niet automatisch aangeroepen zal worden vormt het probleem niet... die kun je toch handmatig aanroepen met System.gc()
Als je elke keer System.gc() aanroept als je iets wil verwijderen kun je net zo goed zelf een methode maken die je dan aanroept.

Acties:
  • 0 Henk 'm!

  • CAPSLOCK2000
  • Registratie: Februari 2003
  • Laatst online: 11-09 21:28

CAPSLOCK2000

zie teletekst pagina 888

Verwijderd schreef op woensdag 23 december 2009 @ 18:44:

Dat de garbage collector niet automatisch aangeroepen zal worden vormt het probleem niet... die kun je toch handmatig aanroepen met System.gc()
Als je genoeg geheugen vrij hebt kan de Garbage Collector besluiten om niks te doen, en als ie wel wat doet gaat je performance door het putje.

(Nog een probleem, de werking van de GC kan verschillen tussen versies van Java, dus je kan het gedrag niet ees betrouwbaar testen).

This post is warranted for the full amount you paid me for it.


Verwijderd

Topicstarter
Jegorex schreef op woensdag 23 december 2009 @ 19:00:
[...]

Als je elke keer System.gc() aanroept als je iets wil verwijderen kun je net zo goed zelf een methode maken die je dan aanroept.
Geen idee hoe je dat doet?

Maak je dan niet gewoon een aparte methode aan waarin deze functie verwerkt zit?

  • Jegorex
  • Registratie: April 2004
  • Laatst online: 03-09 23:24
Verwijderd schreef op donderdag 24 december 2009 @ 00:19:
[...]


Geen idee hoe je dat doet?

Maak je dan niet gewoon een aparte methode aan waarin deze functie verwerkt zit?
ACM heeft het beter beschreven waarom je een aparte methode ervoor moet maken.

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Volgens mij kun je je beter afvragen waarom je het aantal instanties van je object bij wilt houden. Volgens mij is dit puur en alleen voor debug doeleinden, en daarvoor heb je dingen als debuggers en profilers en dergelijke.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op donderdag 24 december 2009 @ 00:19:
[...]


Geen idee hoe je dat doet?

Maak je dan niet gewoon een aparte methode aan waarin deze functie verwerkt zit?
Als je geen heel erg goede reden hebt om hem aan te roepen, moet je gewoon van System.gc() afblijven.

Als jij wilt dat er 'iets' gebeurt als je een object niet meer gebruikt, dan kan je daar net zo goed een eigen methode aanroepen, ipv proberen de garbage collector te forceren.

Je zou zoiets kunnen maken, waarmee je een thread-safe counter hebt die je in de constructor van zo'n object verhoogt en op het moment dat jij denkt System.gc te moeten aanroepen kan je dan Test.release(..) gebruiken. Heb je ook je eigen finalize dus niet meer nodig.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Test
{
 private static final AtomicInteger counter = new AtomicInteger();
 
 public Test()
 {
  counter.getAndIncrement();
 }

 public static void release(Test test)
 {
  // Doe van alles met je test als je zou willen, en daarna nog even de counter verlagen
  counter.getAndDecrement();
 }

 public static int getObjectCount()
 {
   return counter.get();
 }
}

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Als je echt rare dingen wil doen, zou je ook kunnen denken aan het gebruik van een PhantomReference of een WeakReference om bij te houden welke objecten wel of niet al garbage collected zijn/worden. Normaal gesproken lijkt mij dat echter niet zo nuttig.

Misschien moet de TS maar eens uitleggen waarom hij het aantal nog bestaande objecten wil weten.

  • Sibylle
  • Registratie: Juli 2006
  • Laatst online: 13-07-2023
het zijn allemaal mooie tips die jullie geven, maar ik denk dat de TS zo niet gaat (of moet) gebruiken. zodra alle parameters goed worden doorgegeven :P en het programma runt, kan die beter gewoon in de debugger kijken.

Vinkje zetten bij een regel code, en dan Debug dus. Krijg je alle info die je nodig hebt. Tijdens runtime moet je je eigelijk niet bezig houden met het werk van de javaVM.

Ctrl+k


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Late reply, maar als je een soort van array wilt hebben, en makkelijk dingen uit een array wilt verwijderen, en wilt weten hoeveel items er in zitten, kun je ipv het wiel uitvinden, finalizers, of gc.collects ook gewoon.

Java:
1
import java.utils.Vector;


En die gebruiken natuurlijk :)

~ Mijn prog blog!

Pagina: 1