Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[java] constructor met behulp van this

Pagina: 1
Acties:

  • Teun_2
  • Registratie: Oktober 2003
  • Laatst online: 14-11 07:36
Hallo,

ik heb het volgende stukje code:

Java:
1
2
3
4
5
6
7
8
    public void Text(){
        this("");
    }
    
    public void Text(String inputText){
        this.observers = new ArrayList<ContentObserver>();
        this.text = inputText;
    }


in de klasse Text.

bij de eerste constructor klaagt eclipse dat this(""); op de eerste lijn moet staan. Als ik wat verder zoek op internet moet dit inderdaad ook zo zijn. Maar die this(""); staat al op de eerste lijn en zou dus gewoon moeten werken. Iemand enig idee?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-11 23:43

.oisyn

Moderator Devschuur®

Demotivational Speaker

Beetje rare foutmelding idd. Want wat er niet klopt is dat jij een return-type aan je constructors hebt gekoppeld (namelijk "void").

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Teun_2
  • Registratie: Oktober 2003
  • Laatst online: 14-11 07:36
Bedankt, dat werkt dus :)
Ik ben nog nieuw met java

[ Voor 35% gewijzigd door Teun_2 op 03-04-2008 13:50 ]


  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Als je avatar je pasfoto is, ben je er vroeg bij ;)

"Any sufficiently advanced technology is indistinguishable from magic."


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 17:54

Haan

dotnetter

Je moet inderdaad "void" weglaten als het om een constructor gaat. Maar even voor mijn nieuwsgierigheid, wat zou
Java:
1
this("");
moeten doen?

Daarbij is this eigenlijk alleen nodig als je een parameter hebt die dezelfde naam heeft als een instance variabele, bijv.
Java:
1
2
3
4
5
6
7
8
9
public class Foo
{
    String bar;
    
    public Foo(String bar)
    {
        this.bar = bar;
    }
}

Kater? Eerst water, de rest komt later


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20:02
Een beetje pedantisch, maar het is (zeker als je pas begint met programmeren) belangrijk dat je goed leest wat de compiler meldt. Eclipse (maar ook de Sun Java Compiler) geven over het algemeen hele duidelijke foutmeldingen. In dit geval:
code:
1
2
3
4
5
6
7
8
9
1. WARNING
        public void Text() {
                    ^^^^^^
This method has a constructor name

2. ERROR
        this("");
        ^^^^^^^^^
Constructor call must be the first statement in a constructor

De eerste warning geeft dus aan dat je een methode hebt gedeclareerd ("this method has a constructor name") en de tweede dat de constructor call het eerste statement in een constructor moet zijn. Niet om je verder af te branden, maar die foutmelding is dus wel juist. (En het toont ook maar weer aan dat het belangrijk is om foutmeldingen correct en volledig over te nemen als je om hulp vraagt; het is dat .oisyn nu snel zag waar de fout zat, maar in andere gevallen zijn compilermeldingen erg nuttig.)

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20:02
Haan schreef op donderdag 03 april 2008 @ 13:53:
Daarbij is this eigenlijk alleen nodig als je een parameter hebt die dezelfde naam heeft als een instance variabele, bijv.
Nee, breng die man nu niet verder in verwarring. ;)

Het this keyword wordt voor verschillende doelen gebruikt. Je kunt ermee refereren naar het huidige object (e.g. this.value) maar het wordt ook gebruikt om een andere constructor aan te roepen; dan gebruik je 'm simpelweg zoals de topic starter al deed, alsof er een methode genaamd this is. Je kunt op een vergelijkbare manier de constructor van een superklasse callen door het keyword super te gebruiken (en dan gewoon haakje openen, argumenten, haakje sluiten).

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Als toevoeging op Soultaker: De eerste foutmelding is doorgaans het meest waardevol. De rest van de fouten kan slechts een gevolg zijn van de eerdere fouten, dus begin bovenaan vooraan met het bugfixen. :)

[ Voor 4% gewijzigd door Voutloos op 03-04-2008 14:38 ]

{signature}


  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Voutloos schreef op donderdag 03 april 2008 @ 14:10:
Als toevoeging op Soultaker: De eerste foutmelding is doorgaans het meest waardevol. De rest van de fouten kan slechts een gevolg zijn van de eerdere fouten, dus begin bovenaan met het bugfixen. :)
Dat hangt ook wel van de situatie af volgens mij. Ik ben ook wel fan van root causes in stack traces. ;)

Sundown Circus


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 17:54

Haan

dotnetter

@Soultaker: die eerste constructie met this kende ik niet (zoals je in m'n post ook kan zien ;) ), maar in die tweede constructor is het niet nodig om this te gebuiken.

Kater? Eerst water, de rest komt later


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
RedRose schreef op donderdag 03 april 2008 @ 14:31:
[...]
Dat hangt ook wel van de situatie af volgens mij. Ik ben ook wel fan van root causes in stack traces. ;)
In een stack zit dan ook het eerste ding onderop. B)

[ Voor 68% gewijzigd door Voutloos op 03-04-2008 14:32 ]

{signature}


  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 18:44
Haan schreef op donderdag 03 april 2008 @ 13:53:
Je moet inderdaad "void" weglaten als het om een constructor gaat. Maar even voor mijn nieuwsgierigheid, wat zou
Java:
1
this("");
moeten doen?
Die roept de constructor public Text(String inputString) aan. :)

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Voutloos schreef op donderdag 03 april 2008 @ 14:32:
[...]
In een stack zit dan ook het eerste ding onderop. B)
Dus moet je niet bovenaan beginnen.. B)

Sundown Circus


  • YopY
  • Registratie: September 2003
  • Laatst online: 06-11 13:47
Volgens mij wordt de punt als zinsterminator langzaamaan vervangen door de smilie :)

Semi-on-topic, die fout (een constructor declareren als iets dat void teruggeeft) maakte ik in het begin ook vaak. Maar da's een kwestie van wennen. In de regel geeft een constructor als resultaat een instantie van het object wat je ermee aanmaakt terug, dus het aangeven van een andere return value (void in dit geval) zal niet beschouwd worden als constructor.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-11 23:43

.oisyn

Moderator Devschuur®

Demotivational Speaker

Een constructor geeft niets terug, een constructor construct het object waar 'this' naar wijst. Dit klinkt mierenneukerig, maar het is iets dat in andere talen (C++, javascript) duidelijker naar voren komt. De new operator is het ding wat het object aanmaakt en daar vervolgens de constructor op aanroept.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MueR
  • Registratie: Januari 2004
  • Laatst online: 20:31

MueR

Admin Devschuur® & Discord

is niet lief

Het enige wat een constructor (als je ontwerp klopt) terug geeft zijn exceptions wanneer er iets fout gaat, required data ontbreekt/incorrect is enzovoorts.

@writser:
Dat is zo, maar ook afhankelijk hoe je het interpreteert. Als ik een exception throw geef ik wel iets terug, vind ik. Ik vertel mezelf dat ik dom bezig ben, of ik vertel het tegen de user.

[ Voor 39% gewijzigd door MueR op 03-04-2008 17:00 ]

Anyone who gets in between me and my morning coffee should be insecure.


  • writser
  • Registratie: Mei 2000
  • Laatst online: 19-11 22:44
MueR schreef op donderdag 03 april 2008 @ 16:11:
Het enige wat een constructor (als je ontwerp klopt) terug geeft zijn exceptions wanneer er iets fout gaat, required data ontbreekt/incorrect is enzovoorts/
Exceptions 'geef je niet terug', ze lopen buiten de normale program flow om. Bovendien is het throwen van exceptions in constructors ten zeerste af te raden. Zie bijv.: http://www.arirom.com/eng/javaInternet/Chapter10.html

[ Voor 16% gewijzigd door writser op 03-04-2008 16:16 ]

Onvoorstelbaar!


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20:02
writser schreef op donderdag 03 april 2008 @ 16:15:
Exceptions 'geef je niet terug', ze lopen buiten de normale program flow om.
Het is maar net hoe je er tegenaan kijkt...
Bovendien is het throwen van exceptions in constructors ten zeerste af te raden.
Lijkt me dan raar dat de standaard libraries van Sun voor van alles en nogwat exceptions throwen (denk aan FileNotFoundException van IO klasses, om maar niet te spreken van IllegalArgumentExceptions en NullPointerExceptions).

Trouwens, misschien handig om de Java-discussie verder in een ander topic te doen? De vraag van de topic starter is ruimschoots behandeld.

  • writser
  • Registratie: Mei 2000
  • Laatst online: 19-11 22:44
Lijkt me dan raar dat de standaard libraries van Sun voor van alles en nogwat exceptions throwen (denk aan FileNotFoundException van IO klasses, om maar niet te spreken van IllegalArgumentExceptions en NullPointerExceptions).
Je hebt een punt, het kan ook wel. Ik zeg alleen dat het af te raden is omdat je enorm goed moet opletten, bijvoorbeeld als je een superconstructor aanroept, of als je meerdere resources gaat locken. En enge combinaties daarvan etc.

[ Voor 3% gewijzigd door writser op 03-04-2008 17:05 ]

Onvoorstelbaar!

Pagina: 1