[Java] Naam van aktie in String

Pagina: 1
Acties:
  • 154 views sinds 30-01-2008
  • Reageer

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Mischien een beetje een vage titel maar ik had geen idee hou ik het anders had moeten noemen...

Ik heb een appletje met heeel veel Buttons erin.
In de methode actionPerformed wil ik weten welke knop er in is gedrukt.
Nu heb ik dit in de code staan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void actionPerformed (ActionEvent klik){
        
   if (klik.getSource(); == knop1){
       String aktie = knop1;
   }

   if (klik.getSource(); == knop2){
       String aktie = knop2;
   }

   if (klik.getSource(); == knop3){
       String aktie = knop3;
   }

enz.. enz..

}

Dit moet volgens mij korter kunnen dus vroeg ik me af of er een manier was om de klik.getSource() niet direct in een String te proppen of desnoods dit hele gebeuren met switch/case te verkorten.. Ik heb al aardig wat geprobbed en gezocht maar zonder resultaat..

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Allereerst is die code al fout. De Source van een ActionEvent is helemaal geen String, dus kan je hem ook niet aan een String aktie toewijzen. Verder moet je de String aktie niet genest in de if declareren. Ook moet er geen ; achter getSource().

Maar je moet dit probleem ook helemaal niet zo oplossen. Het is veel netter om elke button een eigen ActionListener te geven. Dergelijke series van ifjes (of een switch) moet je altijd proberen te voorkomen.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Met andere woorden.. doe maar lekker veel werk dat is netter?
Oei.. daar was ik al bang voor... :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Maxonic: Met andere woorden.. doe maar lekker veel werk dat is netter?
Netter heeft over het algemeen een goede reden. Iets is niet netjes omdat het netjes is, maar omdat het bepaalde voordelen biedt :) . Als je alle mogelijkheden afgaat op deze manier moet je op verschillende plekken iets aanpassen als je 1 knop wilt toevoegen. Bovendien kan in een dergelijke oplossing heel gemakkelijk ergens een foutje insluipen: oeps verkeerde aktie label. Foutje: knop werkt niet meer :) . Aparte ActionListeners zijn duidelijker, beter te onthouden en beter herbruikbaar :)

Over het algemeen zijn series van ifjes in een OO-ontwerp altijd fout (voor de liefhebbers: Replace Conditional with Polymorphism).

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

mbv actions is het veel eenvoudiger en sneller dan een algemene actionPerformed..
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
FunnyAction funnyAction = new FunnyAction();
JButton funnyButton = new JButton(funnyAction);

JMenu funnyMenu = new JMenu("Funny");
JMenuItem funnyMenuItem = funnyMenu.add(funnyAction);

JToolbar toolbar = new JToolbar();
JButton funnyToolbarButton = toolbar.add(funnyAction);

class FunnyAction extends AbstractAction
{
   public FunnyAction()
   {
       super("Be funny");
   }
   
   public void actionPerformed(ActionEvent ae)
   {
       System.out.println("Formatting c drive");
   }
}

Hiermee maak je veel eenvoudiger complexe gui`s. En je kan ook heel eenvoudig dezelfde actie aan meerdere componenten hangen, zoals hier de funnyButton,funnyToolbarButton en de funnyMenuItem. En dat is supermakkelijk voor combi toolbar en menu waar dus ook dezelfde acties in voorkomen..

[edit]toolbar er ook bij :)

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op maandag 08 oktober 2001 12:41 schreef mbravenboer het volgende:

Maar je moet dit probleem ook helemaal niet zo oplossen. Het is veel netter om elke button een eigen ActionListener te geven. Dergelijke series van ifjes (of een switch) moet je altijd proberen te voorkomen.
Hier ben ik het niet mee eens (sorry martin)

Ik denk dat beginnende java programmeurs het wel op deze manier moeten doen en de innerclass eventhandling classes even moeten laten zitten tot ze meer ervaring hebben met Java

Een switch gaat zoiezo niet werken aangezien die alleen met int's werkt.
een if/else boom is voor beginners (en sommige gevorderden) overzichtelijker als innerclasses

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 13:31 schreef wasigh het volgende:

[..]

Hier ben ik het niet mee eens (sorry martin)

Ik denk dat beginnende java programmeurs het wel op deze manier moeten doen en de innerclass eventhandling classes even moeten laten zitten tot ze meer ervaring hebben met Java
Ik zou een beginnende programmeur al helemaal niet achter Java zetten. Laat ze eerst maar bezig gaan met pascal en modula later c en asm. En dan naar Java.. Eerst moeten ze basis kennis hebben.

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op maandag 08 oktober 2001 13:34 schreef Alarmnummer het volgende:

[..]

Ik zou een beginnende programmeur al helemaal niet achter Java zetten. Laat ze eerst maar bezig gaan met pascal en modula later c en asm. En dan naar Java.. Eerst moeten ze basis kennis hebben.
Java als taal is denk ik erg geschikt om mensen te leren programmeren vooral omdat ik het een "schone" taal vind.

OO e.d. moet je eigenlijk pas aan beginnen als iemand de syntax begrijpt..

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Op maandag 08 oktober 2001 13:34 schreef Alarmnummer het volgende:

[..]

Ik zou een beginnende programmeur al helemaal niet achter Java zetten. Laat ze eerst maar bezig gaan met pascal en modula later c en asm. En dan naar Java.. Eerst moeten ze basis kennis hebben.
Ok.. en DAAR ben ik het dan weer niet mee eens..
Ik denk dat Java een prachtige taal is om mee te beginnen en dat je met Java ook een prachtige basis kan leggen voor het proggen in andere talen...

Ik denk ook dat ik niet de enige ben die er zo over denkt. Voorbeeld: bij ons op school wordt in de 1ste klas uitsluitend les in Java gegeven...

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 13:42 schreef Maxonic het volgende:

[..]

Ok.. en DAAR ben ik het dan weer niet mee eens..
Ik denk dat Java een prachtige taal is om mee te beginnen en dat je met Java ook een prachtige basis kan leggen voor het proggen in andere talen...

Ik denk ook dat ik niet de enige ben die er zo over denkt. Voorbeeld: bij ons op school wordt in de 1ste klas uitsluitend les in Java gegeven...
In HIO friesland proggen ze in Delhi, en dat is dan wel goed? Bij ons, HIO Groningen, proggen ze ook in Java, maar ik ben nog een van de oude stempel. Toen ik nog Informatica deed op de Universiteit krijgen we gewoon pascal. En daar valt meer dan genoeg in te leren.

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op maandag 08 oktober 2001 13:42 schreef Maxonic het volgende:

[..]

Ik denk ook dat ik niet de enige ben die er zo over denkt. Voorbeeld: bij ons op school wordt in de 1ste klas uitsluitend les in Java gegeven...
offtopic:
He bij mij ook!
(maar dat komt vast omdat we op dezelfde school zitten ;))

Laten we het verder niet hebben over het niveau bij ons op school :'(

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 13:42 schreef Maxonic het volgende:
Ik denk dat Java een prachtige taal is
En daar ben ik het 110% mee eens :P

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 13:42 schreef Maxonic het volgende:

[..]

Ok.. en DAAR ben ik het dan weer niet mee eens..
Ik denk dat Java een prachtige taal is om mee te beginnen en dat je met Java ook een prachtige basis kan leggen voor het proggen in andere talen...

Ik denk ook dat ik niet de enige ben die er zo over denkt. Voorbeeld: bij ons op school wordt in de 1ste klas uitsluitend les in Java gegeven...
Verklaard misschien waarom van de HIO zo`n lading prutsers komen?

  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

Op maandag 08 oktober 2001 13:34 schreef Alarmnummer het volgende:

[..]

Ik zou een beginnende programmeur al helemaal niet achter Java zetten. Laat ze eerst maar bezig gaan met pascal en modula later c en asm. En dan naar Java.. Eerst moeten ze basis kennis hebben.
dit vind ik geleuter van de bovenste plank. Waarom moet je eerst Pascal doen, dan ASM en C, en dan pas Java?
Je kunt net zo goed met Java beginnen en als je dan specifiekere dingen gaat programmeren, naar C overstappen. Die stap is vanwege de syntax alleen al niet erg groot...
Met ASM hoef je in ieder geval absoluut niet te beginnen voordat je welke andere taal dan ook gaat doen ...

Ik snap gewoon helemaal niets van jouw redenatie. Ben zelf ooit begonnen met Basic & Pascal, daarna Java en een beetje C/C++, toen Delphi etc.
En ik moet zeggen, je hoeft echt niet een C basis te hebben voordat je gaat Java-en ...

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
wasigh: Hier ben ik het niet mee eens (sorry martin)
Itt tot wat veel mensen denken is het volkomen legaal om het met mij oneens te zijn hoor ;) .
Ik denk dat beginnende java programmeurs het wel op deze manier moeten doen en de innerclass eventhandling classes even moeten laten zitten tot ze meer ervaring hebben met Java
Event-handling met inner-classes wil ik ook absoluut niet aanmoedigen. Wel wil ik een duidelijke uitleg van OO principes als interfaces aanmoedigen. Door dit gelijk aan het begin goed te behandelen kan een hoop veel duidelijker worden. Te vaak worden taal-features eerst niet uitgelegd omdat dit te moeilijk zou zijn. Omdat ze echter wel aanwezig zijn zorgt dit juist voor erg veel verwarring. Interfaces zijn absoluut niet moeilijk, ze moeten alleen wel uitgelegd worden :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Op maandag 08 oktober 2001 13:48 schreef Alarmnummer het volgende:

[..]

Verklaard misschien waarom van de HIO zo`n lading prutsers komen?
* Maxonic slaps Alarmnummer :P

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 13:50 schreef limoentje het volgende:

[..]

dit vind ik geleuter van de bovenste plank. Waarom moet je eerst Pascal doen, dan ASM en C, en dan pas Java?
Je kunt net zo goed met Java beginnen en als je dan specifiekere dingen gaat programmeren, naar C overstappen. Die stap is vanwege de syntax alleen al niet erg groot...
Met ASM hoef je in ieder geval absoluut niet te beginnen voordat je welke andere taal dan ook gaat doen ...

Ik snap gewoon helemaal niets van jouw redenatie. Ben zelf ooit begonnen met Basic & Pascal, daarna Java en een beetje C/C++, toen Delphi etc.
En ik moet zeggen, je hoeft echt niet een C basis te hebben voordat je gaat Java-en ...
Ik denk dat ze veel te veel bezig gaan met event listereners, buttons, gui en andere mooie zaken.

Maar belangrijke dingen zoals een for lus (wanneer je die exact gebruikt) een while lus, een do while lus, switch case commando`s. Gewoon de dingen die jullie als standaard beschouwen die doen ze allemaal fout (Kan het weten, ben tijdje student assistent geweest bij practicum proggen).

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Alarmnummer: Verklaard misschien waarom van de HIO zo`n lading prutsers komen?
Op de UU wordt in het eerste jaar ook alleen Java en Haskell gegeven.

Misschien een beetje een loze en onnodig beledigende opmerking dus.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 13:54 schreef Maxonic het volgende:

[..]

* Maxonic slaps Alarmnummer :P
Ik vind een HIO diploma (universiteit evenmin) geen garantie om een goeie programmeur in huis te halen. De meeste mensen zijn knoeiers en prutsen maar wat in hun code aan (probeer er niets aan te veranderen anders gaat het hangen). En ze produceren volledig ononderhoudbare code. (ook weer eigen ervaring).

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 13:56 schreef mbravenboer het volgende:

[..]
Misschien een beetje een loze en onnodig beledigende opmerking dus.
Het is niet bedoelt om te beledigen, en de mensen die goed kunnen proggen die hoeven zich ook zeker niet aangesproken te voelen. Maar dit zijn ervaringen die ik hier heb opgedaan (begeleid zo nu en dan HIO stageres op de RuG) en mijn ervaringen met mijn klasgenoten. Er zijn een paar mensen die goed proggen, en de rest die teerd daar een beetje op.

[edit]moest ook nog even klasgenoten beledigen :)

  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

Op maandag 08 oktober 2001 13:55 schreef Alarmnummer het volgende:

[..]

Ik denk dat ze veel te veel bezig gaan met event listereners, buttons, gui en andere mooie zaken.

Maar belangrijke dingen zoals een for lus (wanneer je die exact gebruikt) een while lus, een do while lus, switch case commando`s. Gewoon de dingen die jullie als standaard beschouwen die doen ze allemaal fout (Kan het weten, ben tijdje student assisten geweest bij practicum proggen).
Maar GUI's (buttons, listeners, ...) horen naar mijn mening ook helemaal niet bij programmeren maar meer bij design. Programmeren draait om arrays, for lussen, if blokken en mooie oplossingen. Een GUI kun je niet "slim" of "mooi" programmeren, hooguit kort of uitgebreid, maar in principe heeft dat gewoon geen ene ### met programmeren van doen. Eigenlijk is dat meer een combinatie van grafisch design en usability, en niet van inzicht op programmeergebied. Inzicht in hoe een GUI handig ingericht kan worden, is usability ...

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 14:01 schreef limoentje het volgende:

[..]

Maar GUI's (buttons, listeners, ...) horen naar mijn mening ook helemaal niet bij programmeren maar meer bij design. Programmeren draait om arrays, for lussen, if blokken en mooie oplossingen. Een GUI kun je niet "slim" of "mooi" programmeren, hooguit kort of uitgebreid, maar in principe heeft dat gewoon geen ene ### met programmeren van doen. Eigenlijk is dat meer een combinatie van grafisch design en usability, en niet van inzicht op programmeergebied. Inzicht in hoe een GUI handig ingericht kan worden, is usability ...
Ben ik helemaal met je eens, maar toch steken ze toch te veel tijd in die zaken en komen *ahum* klasieke dingen (for lus, if statement, case etc etc) in het verdring.

  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

Op maandag 08 oktober 2001 14:03 schreef Alarmnummer het volgende:

[..]

Ben ik helemaal met je eens, maar toch steken ze toch te veel tijd in die zaken en komen *ahum* klasieke dingen (for lus, if statement, case etc etc) in het verdring.
je hebt gelijk hoor, daar niet van 8-)
zat klasgenoten die een fantastisch leuke interface inelkaar kunnen draaien, maar als er daarna een simpel probleem opgelost moet worden (bijvoorbeeld grote string of array bewerkingen, of wat heel simpele threading demos) wordt er in een keer gecopy/paste to the maxx 8-)

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

ouch

* wasigh is een hio-er

Toch moet ik het wel met je eens zijn er zijn veel "prutsers" op de HIO. Die de ballen verstand hebben van programmeren.
En om het vak "programmeren" aantrekkelijk te houden(face it, we hebben nog steeds veel programmeurs nodig, ook al zijn ze niet ontzettend goed er is meer dan genoeg werk)
wordt er dan meestal begonnen met gui's etc.

Niet iedereen ziet de schoonheid van de Prompt in zeg maar ;)

De mensen waar ik op doel willen vooral snel een werkende applicatie en hebben geen zin in moeilijk gedoe over classes, overloading etc. Laat staan een backtracking probleem..

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Wat zijn we toch weer lekker off-topic..
Om dit topic toch nog een beetje nut te geven heb ik nog een vraagje:

Kan je (in Java >:)) een string waarin een berekening zit. (bijv "1+2*35/8") uit laten rekenen, of moet deze dan eerst helemaal in stukjes gehakt worden en vervolgens naar int's omgezet worden?

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op maandag 08 oktober 2001 14:17 schreef Maxonic het volgende:
Wat zijn we toch weer lekker off-topic..
Om dit topic toch nog een beetje nut te geven heb ik nog een vraagje:

Kan je (in Java >:)) een string waarin een berekening zit. (bijv "1+2*35/8") uit laten rekenen, of moet deze dan eerst helemaal in stukjes gehakt worden en vervolgens naar int's omgezet worden?
hij moet eerst in stukjes gehakt worden (als je er spaties tussen zet kun je een StringTokenizer gebruiken om te helpen in stukjes te hakken ;))

Als je het goed doet maak je een versie die met haakjes overweg kan (zal Bert leuk vinden!)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 14:17 schreef Maxonic het volgende:
Wat zijn we toch weer lekker off-topic..
Om dit topic toch nog een beetje nut te geven heb ik nog een vraagje:

Kan je (in Java >:)) een string waarin een berekening zit. (bijv "1+2*35/8") uit laten rekenen, of moet deze dan eerst helemaal in stukjes gehakt worden en vervolgens naar int's omgezet worden?
Ik geloof dat het niet kan in Java (misschien met nieuwe api wel) maar je kunt het echt heel eenvoudig zelf schrijven. Ten eerst moet je die tekst gaan goed keuren, want 10**10 is geen goeie expressie. Daarvoor moet je 10**10 stukhakken (lexen) naar 10,*,*,10. Dan moet je een taal ontwerpen wat je allemaal goeie text vind. Deze taal die schrijv je in BNF of EBNF. Dit kan je heel eenvoudig vertalen mbv een vertaal schema naar java code. Je kan ook (zoals ik :) ) een parser generator voor gebruiken zoals: antlr (http://www.antlr.org). Deze tool converteeld enbf + inline java :) naar java source code en controleert ook op ambiguiteit (onbeslisbaarheid). Tijdens het parsen kun je alles structuren meteen in het geheugen plaatsen. Hieronder voorbeeld voor jullie probleem:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
{
import java.io.*;
}

class ExprParser extends Parser;

options {
    codeGenMakeSwitchThreshold = 3;
    codeGenBitsetTestThreshold = 4;
    buildAST=true;
    ASTLabelType = "antlr.CommonAST"; // change default of "AST"
}

expr : assignExpr EOF! ;

assignExpr
    :   addExpr
        (
            ASSIGN^
            assignExpr 
        )?
    ;

addExpr
    :   multExpr 
        (
            pm:PLUS_MINUS^
            me:multExpr
            exception 
                catch [ RecognitionException ex ] 
                { 
                    System.out.println("Caught error in addExpr");
                    reportError(ex.toString()); 
                }
        )*
    ;

multExpr
    :   postfixExpr
        (
            MULT_DIV^
            postfixExpr
        )*
    ;

postfixExpr
    :   (id:ID LPAREN)=>
        // Matches function call syntax like "id(arg,arg)" 
        id2:ID^
        (
       parenArgs
        )?
    |   atom
    ;

parenArgs
    :   
    LPAREN!
    (
       assignExpr
       (
        COMMA!
          assignExpr
       )*
    )?
    RPAREN!
    ;

atom
    :   ID
    |   INT
    |   CHAR_LITERAL 
    |   STRING_LITERAL
    |   LPAREN! assignExpr RPAREN!
    ;

class ExprLexer extends Lexer;

WS  :   (' '
    |   '\t'
    |   '\n'
    |   '\r')
        { _ttype = Token.SKIP; }
    ;

LPAREN: '('
    ;

RPAREN: ')'
    ;

PLUS_MINUS: '+' | '-'
    ;

MULT_DIV : '*' | '/'
   ;

ASSIGN :    '='
    ;

COMMA : ','
   ;
   
CHAR_LITERAL
    :   '\'' (ESC|~'\'') '\''
    ;

STRING_LITERAL
    :   '"' (ESC|~'"')* '"'
    ;

protected
ESC :   '\\'
        (   'n'
        |   'r'
        |   't'
        |   'b'
        |   'f'
        |   '"'
        |   '\''
        |   '\\'
        |   ('0'..'3')
            (
                options {
                    warnWhenFollowAmbig = false;
                }
            :   ('0'..'9')
                (   
                    options {
                        warnWhenFollowAmbig = false;
                    }
                :   '0'..'9'
                )?
            )?
        |   ('4'..'7')
            (
                options {
                    warnWhenFollowAmbig = false;
                }
            :   ('0'..'9')
            )?
        )
    ;

protected
DIGIT
    :   '0'..'9'
    ;

INT 
    : (DIGIT)+
    ;

ID
options {
    testLiterals = true;
}
    :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
    ;

Hier staat wel een inleiding: http://www.antlr.org/Articles/langparse.html

[edit]hmmm... tis toch iets minder eenvoudig :)

[edit] download: http://www.geocities.com/peter_veentjer/exprAST.zip

[edit] betere versie: http://www.geocities.com/peter_veentjer/heteroAST.zip

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Op maandag 08 oktober 2001 14:20 schreef wasigh het volgende:

[..]

Als je het goed doet maak je een versie die met haakjes overweg kan (zal Bert leuk vinden!)
Asjeblieft zeg.. kom er zo al niet uit ;(

Alarmnummer: Erg bedankt maar ik denk niet dat deze HIO-Prutser dat voor elkaar krijgt... :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 14:43 schreef Maxonic het volgende:

[..]

Asjeblieft zeg.. kom er zo al niet uit ;(

Alarmnummer: Erg bedankt maar ik denk niet dat deze HIO-Prutser dat voor elkaar krijgt... :)
Als je het een keer onder de knie hebt, dan is een parser schrijven echt geen probleem meer. En zoiets als dit schrijf tussen neus en lippen door :) Maar het ziet er inderdaad nogal lastig uit :)

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Damn.. loop nu al een tijdje te zoeken maar nee hoor.. geen samples of tutje voor die StringTokenizer ;(
Kom er niet meer uit...

Ok, hier komt mijn laatste kans:
Kan iemand mij ff uitleggen hoe ik met die StringTokenizer werk? :?

Op verzoek wil ik gerust de code die ik tot nu toe heb neerdumpen...

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Als je met een string tokenizer gaat werken en je gaat van links naar rechts evalueren dan krijg je nogal wat problemen om operatie prioriteit in te stellen (* is sterker dan de +) dus 10+4*5 = 10+(4*5)=30 en niet (10+4)*5=70. En je moet overal een spaties tussen schrijven, dus 10*20 gaat echt niet werken, dat moet worden 10_*_20.

Als je ff door de java source hiervan loopt dan staat daar zelf een mooi voorbeeldje in :)

http://www.geocities.com/peter_veentjer/heteroAST.zip

tis een voorbeeldje uit de documentatie van antlr om zelf een simpele expressie parser/evaluator te schrijven. Maar tis geen verplichting hoor :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 15:28 schreef Maxonic het volgende:
Damn.. loop nu al een tijdje te zoeken maar nee hoor.. geen samples of tutje voor die StringTokenizer ;(
Kom er niet meer uit...

Ok, hier komt mijn laatste kans:
Kan iemand mij ff uitleggen hoe ik met die StringTokenizer werk? :?

Op verzoek wil ik gerust de code die ik tot nu toe heb neerdumpen...
En je moet wel even beter zoeken hoor :) Heb bij search.sun.com StringTokenizer ingetyped en voila, meteen de eerste een voorbeeld

http://search.java.sun.com/Search/java?col=jsun&pw=100%25&ws=0&nh=10&qt=StringTokenizer

[edit] http://search.java.sun.com ipv http://seach.sun.com :)

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Heej.. tnx.. die page is alleen redelijk "not avalible" :)

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
ARgh.. ik wordt gek.. ben nu al zo'n 9 uur non-stop bezig aan een simpele calculator.. ;'(
Ik heb het gevoel dat ik er bijna ben..
Wat doe ik nu nog fout??
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
/*
 * Calculator.java
 * Copyright 2001 by Maxonic
 * Mail: info@maxonic.net
 *
 */

import java.awt.*;      
import java.awt.event.*;        
import java.applet.Applet;
import java.util.StringTokenizer;
import java.lang.Boolean; //Nodig maar werkt niet.. dan maar met string...

public class Calculator extends Applet implements ActionListener {
    
    // Even een paar strings declareren...
    private Button    knop1, knop2, knop3, knop4, knop5, knop6, knop7, knop8, knop9, knop0, knopIs, knopClear, knopPlus, knopMin, knopMaal, knopDeel; 
    private TextField   display;
    private String      waarde= "", operator = "", alles = "", vorigOp = "false";
    private int      aktie = 0, soortOp = 0;        
    
    
    // Deze methode wordt automatisch gedraaid.
    public void init () {
        
        setLayout(null); //Ik wil zelf bepalen waar de knoppen komen te staan.
        setBackground(Color.lightGray);                             
                
        // Hier wordt de methode aangeroepen die de knoppen maakt.
        // De locatie kan ik makkelijk met 1 ipv. 2 getallen weergeven.
        
        knop1 = nieuweButton("1",1);
        knop2 = nieuweButton("2",2);
        knop3 = nieuweButton("3",3);
        knop4 = nieuweButton("4",5);
        knop5 = nieuweButton("5",6);
        knop6 = nieuweButton("6",7);
        knop7 = nieuweButton("7",9);
        knop8 = nieuweButton("8",10);
        knop9 = nieuweButton("9",11);
        knop0 = nieuweButton("0",14);
        
        knopIs       = nieuweButton("=",15);
        knopClear    = nieuweButton("AC",13);
        
        knopPlus     = nieuweButton("+",4);
        knopMin  = nieuweButton("-",8);
        knopMaal     = nieuweButton("x",12);
        knopDeel     = nieuweButton(":",16);
    
        // Dan komt hier het display waar de berekening ook handmatig ingetypt kan worden.
        display = new TextField(40);
        display.setBounds(100, 80, 120, 20);
        add(display);
        display.addActionListener(this);
            
    }
    
    
    private Button nieuweButton (String caption, int positie) {
        
        
        int positieX = ((((positie - 1) % 4) * 30) + 100); //De X-coordinaten van de knoppen
        int positieY = ((((positie - 1) / 4) * 30) + 100); //De Y-coordinaten van de knoppen
        
        Button button = new Button(caption);
        button.setBounds(positieX, positieY, 30, 30);
        add(button);
        button.addActionListener(this);
        return button;
    }
    

    
    public void actionPerformed (ActionEvent klik) {
        
        // Hier kon ik geen simpelere manier voor verzinnen, en alle knoppen een apperte ActionListener geven is ook niet alles :(      
        
        if (klik.getSource() == knop1)
            waarde = "1";
            
        if (klik.getSource() == knop2)
            waarde = "2";
            
        if (klik.getSource() == knop3)
            waarde = "3";
            
        if (klik.getSource() == knop4)
            waarde = "4";
            
        if (klik.getSource() == knop5)
            waarde = "5";
            
        if (klik.getSource() == knop6)
            waarde = "6";
            
        if (klik.getSource() == knop7)
            waarde = "7";
            
        if (klik.getSource() == knop8)
            waarde = "8";
            
        if (klik.getSource() == knop9)
            waarde = "9";
            
        if (klik.getSource() == knop0)
            waarde = "0";
            
        // De volgende knoppen laten dadelijk een operator toevoegen
        if (klik.getSource() == knopPlus)
            operator = "+";

        if (klik.getSource() == knopMin)
            operator = "-";

        if (klik.getSource() == knopMaal)
            operator = "*";
            
        if (klik.getSource() == knopDeel)
            operator = "/";
        
        // De volgende 2 zijn appart omdat deze de string geen waarde meegeven maar iets met de string doen.
        if (klik.getSource() == knopClear)
            aktie = 1; // Aktie 1 betekent dat de string gereset wordt.
            
        if (klik.getSource() == knopIs)
            aktie = 2; // Aktie 2 is dadelijk het commando om de string om te zetten en uit te rekenen.
        
        // Er kan ook op enter worden gedrukt als men de berekening direct in de textbox neerplant. 
        if (klik.getSource() == display){
            alles = display.getText();
            aktie = 2;
        }
        
        laatZien();
        
    }
    
    
    // Deze methode maakt de textbox weer up-to-date en voert evt. een aktie uit.
    private void laatZien() {
        
        // De volgende regels tellen het nieuwe getal/operator bij de berekening op.
        // Bij een operator komt er meteen een spatie tussen zodat de StringTokenizer later makkelijker de string in stukjes kan hakken.
        
        if (vorigOp == "true") {
            
            if (operator != "") {
            
                alles = "fout";
            
            } else {
            
                alles = alles + " ";
            
            }
            
        } else {
                
            if (operator != "") {

                alles = alles + " " + operator;
                vorigOp = "true";
        
            }
        
        }
        
        if (waarde != "") {
            
            alles = alles + waarde;
            vorigOp = "false";
            
        }
        

        
        
        switch (aktie) {
            case 1 : alles = ""; break; // Als Aktie 1 is wordt het geheel gereset.
            case 2 : bereken(alles);  break; // Als Aktie 2 is wordt de methode aangeroepen om de string om te zetten en te berekenen.
        }
                
        display.setText(alles); //Deze regel zet text in de textbox.. klinkt logisch.. is het ook.
        
        waarde    = "";
        operator = "";
        aktie    = 0;           
        
    }
    
    
    // De volgende methode was even lastig... Deze zet de string om naar begrijpelijke code en berekend deze vervolgens...
    private String bereken(String code){
    
        int antw  = 0;
        
        /* En vanaf hier kom ik niet meer uit de knoop..
         * Ach ja.. ben immers niet voor niets n00b :)
         */
        
        StringTokenizer codeString = new StringTokenizer(code," ");
            while(codeString.hasMoreTokens()) {
                String gedeelte = codeString.nextToken();
                int gedeelteInt = Integer.parseInt(gedeelte);
                
                if ((gedeelte == "+")||(gedeelte == "-")||(gedeelte == "*")||(gedeelte == "/")){
                    
                    if (gedeelte == "+")
                    soortOp = 1;
                    if (gedeelte == "-")
                    soortOp = 2;
                    if (gedeelte == "*")
                    soortOp = 3;
                    if (gedeelte == "/")
                    soortOp = 4;
                    
                } else {
                    
                    if (soortOp > 0){
                        
                        switch (soortOp){
                            
                            case 1: antw = (antw + gedeelteInt); break;
                            case 2: antw = (antw - gedeelteInt); break;
                            case 3: antw = (antw * gedeelteInt); break;
                            case 4: antw = (antw / gedeelteInt); break;
                        
                        }
    
                    } else {
                                    
                    antw = gedeelteInt;
                
                    }
                } 
                
                antw = Integer.parseInt(gedeelte);
                
            }
     
        alles = Integer.toString(antw);
        return alles;
    }   
        
}

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
woops.. ik denk dat ik in een opwelling de lay-out heb vern*ukt.. sorry :P

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

ik zou ten 1e dit anders doen...
code:
1
2
3
4
5
6
7
8
if (klik.getSource() == knop3)
   waarde = "3";
            
if (klik.getSource() == knop4)
   waarde = "4";
            
if (klik.getSource() == knop5)
   waarde = "5";

toevoegen van de else.. scheelt namelijk veel onnodige checks..
code:
1
2
3
4
5
6
if (klik.getSource() == knop3)
   waarde = "3";            
else if (klik.getSource() == knop4)
   waarde = "4";         
else if (klik.getSource() == knop5)
   waarde = "5";

Maar das geen antwoord op je vraag.. :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

En als je een parser schrijft dan kan je dit soort dingen:

http://www.geocities.com/peter_veentjer/screenshot4.jpg

Hoe kan ik trouwens dat plaatje hierop laten zien?

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Ach.. schrale troost...
1 regel klopt iig geval:

alles = "fout"; :)

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Op maandag 08 oktober 2001 17:37 schreef Alarmnummer het volgende:
En als je een parser schrijft dan kan je dit soort dingen:

http://www.geocities.com/peter_veentjer/screenshot4.jpg

Hoe kan ik trouwens dat plaatje hierop laten zien?
Geocities... dus niet.. Deze beveiligd de plaatjes op de server om van buitenaf bekeken te worden.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-


  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Op maandag 08 oktober 2001 17:42 schreef Alarmnummer het volgende:
deze moeten het wel doen :)

http://129.125.172.114
http://129.125.172.114/pictures/screenshot4.jpg
http://129.125.172.114/pictures/screenshot2.jpg

hoe kan ik die plaatjes hier laten zien?
voor de url [_img] neerzetten
na de url [_/img] neerzetten
(zonder _)

zo dus:

Afbeeldingslocatie: http://129.125.172.114/pictures/screenshot4.jpg
Afbeeldingslocatie: http://129.125.172.114/pictures/screenshot2.jpg

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

thanx :)

Afbeeldingslocatie: http://129.125.172.114/pictures/baby2_spooky.gif

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Wow.. heel mooi.. maar ik wil geen slotje..
Ik heb veeeeeeeeel liever een antwoord op de vraag: "wat is er fout in deze methode?!?"
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    private String bereken(String code){
    
        int antw  = 0;

StringTokenizer codeString = new StringTokenizer(code," ");
            
            while(codeString.hasMoreTokens()) {
                String gedeelte = codeString.nextToken();
                int gedeelteInt = Integer.parseInt(gedeelte);
                
                if ((gedeelte == "+")||(gedeelte == "-")||(gedeelte == "*")||(gedeelte == "/")){
                    
                    if (gedeelte == "+")
                    soortOp = 1;
                    else if (gedeelte == "-")
                    soortOp = 2;
                    else if (gedeelte == "*")
                    soortOp = 3;
                    else if (gedeelte == "/")
                    soortOp = 4;
                    
                } else {
                    
                    if (soortOp > 0){
                        
                        switch (soortOp){
                            
                            case 1: antw = (antw + gedeelteInt); break;
                            case 2: antw = (antw - gedeelteInt); break;
                            case 3: antw = (antw * gedeelteInt); break;
                            case 4: antw = (antw / gedeelteInt); break;
                        
                        }
    
                    } else {
                                    
                    antw = gedeelteInt;
                
                    }
                } 
                
                antw = Integer.parseInt(gedeelte);
                
            } 
     
         alles = Integer.toString(antw);
         return alles;
    }

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Je kunt niet zeggen

String s1 = "a";
String s2 = "a";

if(s1 == s2)// kan alleen als het adres van s1 gelijk is aan het adres van s2..

je moet doen:

s1.equals(s2)..

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

En als regel.. gebruik nooit!!!! de == meer oke? Alleen voor primitieve types, en niet!!!!! voor objecten. Gebruik daarvoor altijd de equals :)

Heb het laatst eens uit oude code moeten halen, en dat is lastig.. pfff... ben er paar dagen zoet mee geweest.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

code:
1
2
String gedeelte = codeString.nextToken();
int gedeelteInt = Integer.parseInt(gedeelte);

Stel dat je er de string "10 + 20" gaat tokenizen, dan kom je de eerste keer een 10 tegen, en dat komt nog wel door dit stukje code heen, maar de volgende keer komt ie een "+" tegenen dat converteer je naar een int met als gevolg dat je een NumberFormatException krijgt. Dus dit gaat ook niet werken.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Wat je denk ik veel beter kan doen is het volgende...
code:
1
2
3
4
5
6
7
8
9
int linkergetal = 0;
int rechtergetal = 0;

final static int UNDEFINED_OPERATOR = -1;
final static int PLUS_OPERATOR = 0;
final static int MIN_OPERATOR = 1;
final static int MUL_OPERATOR = 2;

int operator = UNDEFINED_OPERATOR;

De gebruiker die typed een getal in, en dat getal stop je de 1e keer in linkergetal.

GEWONE STAP
De gebruiker die typed nu een operator in, en je gaat dan even uitzoeken welke operator dat was.
code:
1
2
3
4
5
6
if(source.equals(plusButton))
    operator = PLUS_OPERATOR;
else if(source.equals(minButton))
    operator = MIN_OPERATOR;
    
etc etc etc..

Nu gaat de gebruiker weer een getal in typen, en dat getal stop je in rechtergetal. De gebruiker die drukt nu op de = en, je krijgt nu het volgende.
code:
1
2
3
4
5
6
7
8
9
10
switch(operator)
    case PLUS_OPERATOR:
        linkergetal=linkergetal+rechtergetal;
        break;
    case MIN_OPERATOR:
        linkergetal=linkergetal-rechtergetal;
        break;
    break;
    
    etc etc...

En nu blijf je GEWONE STAP herhalen...

Je zou het veel beter kunnen aanpakken mbv een stack en post fix notatie (geen problemen meer met haakjes), maar denk dat dat veel te lastig gaat worden :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Hmmm... 4 post achter elkaar :P

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Hij doet het!!
Dankzij de tip van die gedeelte.equals(operator)
Dank je Alarmnummer.. :Y)

En zelfs zonder al te veel te veranderen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
    private String bereken(String code){
    
        int antw  = 0;
        
        StringTokenizer codeString = new StringTokenizer(code," ");
            
            while(codeString.hasMoreTokens()) {
                String gedeelte = codeString.nextToken();
                                
                if ((gedeelte.equals("+"))||(gedeelte.equals("-"))||(gedeelte.equals("*"))||(gedeelte.equals("/"))){
                    
                    if (gedeelte.equals("+"))
                        soortOp = 1;
                    
                    else if (gedeelte.equals("-"))
                        soortOp = 2;
                    
                    else if (gedeelte.equals("*"))
                        soortOp = 3;
                    
                    else if (gedeelte.equals("/"))
                        soortOp = 4;
                    
                } else {
                    
                    int gedeelteInt = Integer.parseInt(gedeelte);
                    
                    if (soortOp > 0){
                        
                        switch (soortOp){
                            
                            case 1: antw = (antw + gedeelteInt); break;
                            case 2: antw = (antw - gedeelteInt); break;
                            case 3: antw = (antw * gedeelteInt); break;
                            case 4: antw = (antw / gedeelteInt); break;
                        
                        }
    
                    } else {
                                    
                    antw = gedeelteInt;
                
                    }
                }
            } 
     
         alles = Integer.toString(antw);
         return alles;
    }   
        
}

Die numberFormatException kon gewoon verholpen worden door de parseIteger in de If statement te zetten..
Ach ja.. het mag ook wel eens meevallen :P

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Wil trouwens niet 100% lukken..
Als ik nl. een berekening intyp dan krijg ik altijd een NumberFormatException.. Dit komt natuurlijk door die plus/min/maal/deel operators..

Kan ik geen exception op een exception maken ofsow?

} catch (NumberFormatException e) { //Hier komen die + - * / dus niet doorheen

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
limoentje: Maar GUI's (buttons, listeners, ...) horen naar mijn mening ook helemaal niet bij programmeren maar meer bij design.

Programmeren draait om arrays, for lussen, if blokken en mooie oplossingen.

Een GUI kun je niet "slim" of "mooi" programmeren

en niet van inzicht op programmeergebied.
Volkomen mee oneens. Juist ook bij GUIs is het een enorme uitdaging om je OO design goed in elkaar te zetten. Ook hier is het uitermate belangrijk om componenten te kunnen hergebruiken, makkelijk stukken te kunnen aanpassen en een goede scheiding tussen verschillende componenten aan te brengen. Dat is een kunst die je in alle gebiden van de informatica tegen komt. Programmeren draait ook absoluut niet om arrays, for lussen en if blokken. Over dat tijdperk zijn we gelukkig allang heen. Als je GUIs tekent is er natuurlijk niets interessants aan. Zelf GUIs proggen is echter een kunst die heel veel met goede OO-design te maken kan hebben.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if ((gedeelte.equals("+"))||(gedeelte.equals("-"))||(gedeelte.equals("*"))||(gedeelte.equals("/"))){
    if (gedeelte.equals("+"))
        soortOp = 1;
    else if (gedeelte.equals("-"))
        soortOp = 2;
    else if (gedeelte.equals("*"))
        soortOp = 3;
    else if (gedeelte.equals("/"))
        soortOp = 4;
}
else
{
...
}

zou ik vervangen door.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
final static private int PLUS_OPERATOR=1;
final static private int MIN_OPERATOR=2;
final static private int MUL_OPERATOR=3;
final static private int DIV_OPERATOR=4

if (gedeelte.equals("+"))
    soortOp = PLUS_OPERATOR;
else if (gedeelte.equals("-"))
    soortOp = MIN_OPERATOR;
else if (gedeelte.equals("*"))
    soortOp = MUL_OPERATOR;
else if (gedeelte.equals("/"))
    soortOp = DIV_OPERATOR;
else
{
    ...
}

Hiermee verhinder je magic numbers en je kan een hele lading dubbele checks skippen, maar veel succes ermee :)

[edit] layout even aangepast.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 19:27 schreef mbravenboer het volgende:

[..]

Volkomen mee oneens. Juist ook bij GUIs is het een enorme uitdaging om je OO design goed in elkaar te zetten. Ook hier is het uitermate belangrijk om componenten te kunnen hergebruiken, makkelijk stukken te kunnen aanpassen en een goede scheiding tussen verschillende componenten aan te brengen. Dat is een kunst die je in alle gebiden van de informatica tegen komt. Programmeren draait ook absoluut niet om arrays, for lussen en if blokken. Over dat tijdperk zijn we gelukkig allang heen. Als je GUIs tekent is er natuurlijk niets interessants aan. Zelf GUIs proggen is echter een kunst die heel veel met goede OO-design te maken kan hebben.
Zolang mensen niet goed met een for lus omgaan of basis constructies niet beheersen, dan moeten ze nog niet met dit soort ingewikkelde dingen bezig gaan. Ik ben het met je eens dat daar een gigantische uitdaging in zit, om goeie (gui) compontenten te schrijven. Maar ik heb het vaak gezien dat ze daar ook maar aanrommelen omdat ze de basis niet beheersen. Je kunt nooit iets goeds bouwen als de fundering niet aanwezig is. Dat ben je denk ik wel met me eens.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Alarmnummer: zou ik vervangen door.
Over bad smells gesproken ;) . Replace Conditional with Polymorphism:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public interface Operation
{
    public int apply(int argument1, argument2);
}

public class Addition implements Operation
{
    public int apply(int argument1, argument2)
    {
        return argument1 + argument2;
    }
}

public class Multiplication implements Operation
{
    public int apply(int argument1, argument2)
    {
        return argument1 * argument2;
    }
}

public class Substraction implements Operation
{
    public int apply(int argument1, argument2)
    {
        return argument1 - argument2;
    }
}

De constanten zijn nu geen magic numbers meer, maar betekenis volle operaties:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
final static private Operation MULTIPLICATION   = new Multiplication();
final static private Operation SUBSTRACTION     = new Substraction();
final static private Operation ADDITION         = new Addition();

if (gedeelte.equals("+"))
{
    operation = ADDITION;
}
else if (gedeelte.equals("-"))
{
    operation = SUBSTRACTION;
}
else if (gedeelte.equals("*"))
{
    operation = MULTIPLICATION;
}

Je kan nu later gewoon:
code:
1
operation.apply(argument1, argument2);

toepassen zonder dat je kennis hoeft te hebben van de beschikbare operaties.

Heb je trouwens ook al aan prioriteiten gedacht?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Arrrggghhhhh Posts kwijt!!!!

maar ik heb je laatste stukje nog gezien hoor mbravenboer :)
maar denk je niet dat een interface en polymorfisme iets te ver afligt van zijn kunnen? :)

[edit] toch geen post kwijt :) snert GoT server }:O

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

en als we toch bezig gaan :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package com.jph.expertSysteem.treeItems.exprTreeItems.operators;

import com.jph.expertSysteem.*;
import com.jph.expertSysteem.treeItems.exprTreeItems.*;
import com.jph.expertSysteem.treeItems.exprTreeItems.operands.*;
import com.jph.expertSysteem.treeItems.types.*;

import antlr.*;

public final class DivOperator extends BiOperator
{
    public DivOperator()
    {
        super(XLParser.DIV);
    }
    
    protected void checkLeftRoot()throws RuntimeErrorException
    {
        if(!leftRoot.getType().equals(IntegerOperand.intType))
            throw new RuntimeErrorWithTokenException(getWrongLeftTypeMessage(new Type[] {IntegerOperand.intType}),getToken());
    }
    
    protected void checkRightRoot()throws RuntimeErrorException
    {
        if(!rightRoot.getType().equals(IntegerOperand.intType))
            throw new RuntimeErrorWithTokenException(getWrongRightTypeMessage(new Type[] {IntegerOperand.intType}),getToken());
        
        setType(IntegerOperand.intType);
    }

    
    public Operand calc() throws RuntimeErrorException
    {
        IntegerOperand leftOperand = (IntegerOperand)leftRoot.calc();
        IntegerOperand rightOperand = (IntegerOperand)rightRoot.calc();
        
        if (leftOperand.isUnknown())
        {
            if (rightOperand.isUnknown())
                return rightOperand;
            else
            {
                if (rightOperand.getValue()==0)
                    throw new RuntimeErrorWithTokenException("Devision by 0",getToken());
                else
                    return leftOperand;
            }
        }
        else
        {
            if (rightOperand.isUnknown())
                return rightOperand;
            else
            {
                int rightValue = rightOperand.getValue();
                if(rightValue==0)
                    throw new RuntimeErrorWithTokenException("Devision by 0",getToken());
                
                int leftValue = leftOperand.getValue();
                rightOperand.setValue(leftValue/rightValue);
                return rightOperand;
            }
        }
    }
    
    public Operand calcOptimized() throws RuntimeErrorException
    {
        IntegerOperand leftOperand = (IntegerOperand)leftRoot.calcOptimized();
        IntegerOperand rightOperand = (IntegerOperand)rightRoot.calcOptimized();
        
        if (leftOperand.isUnknown())
        {
            if (rightOperand.isUnknown())
                return rightOperand;
            else
            {
                if (rightOperand.getValue()==0)
                    throw new RuntimeErrorWithTokenException("Devision by 0",getToken());
                else
                    return leftOperand;
            }
        }
        else
        {
            if (rightOperand.isUnknown())
                return rightOperand;
            else
            {
                int rightValue = rightOperand.getValue();
                if(rightValue==0)
                    throw new RuntimeErrorWithTokenException("Devision by 0",getToken());
                
                int leftValue = leftOperand.getValue();
                rightOperand.setValue(leftValue/rightValue);
                return rightOperand;
            }
        }
    }
}

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Alarmnummer:
Je kunt niet zeggen

String s1 = "a";
String s2 = "a";

if(s1 == s2)// kan alleen als het adres van s1 gelijk is aan het adres van s2..

je moet doen:

s1.equals(s2)..
Klopt helaas niet helemaal (ik ben ook een keer in die valkuil getrapt ;) ). Strings worden gedeeld, waardoor gelijke strings altijd dezelfde instanties zijn. s1 == s2 zou in dit geval dus true opleveren. Voor alle andere objecten klopt het wel :) .

Waarom trouwens geen == gebruiken? Er zijn best wel veel gevallen waarin je dat gewoon nodig hebt. Als je objecten op inhoud wilt vergelijken, kies je uiteraard voor equals :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Alarmnummer: maar denk je niet dat een interface en polymorfisme iets te ver afligt van zijn kunnen? :)
Ach tja. misschien :). Zo ingewikkeld is het nu echter ook weer niet. Zodra men een constructie met een interface ziet, gaan er gelijk veel mensen flippen :). De bovenstaande oplossing is juist erg makkelijk en duidelijk :) . (bovendien haal je er zeker een punt extra mee ;) )

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Alarmnummer: en als we toch bezig gaan :)

class DivOperator extends BiOperator
Ach tja, het is een bekende oplossing ;) . Het wordt pas echt stoer als het met echte functies werkt >:) ;)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 20:23 schreef mbravenboer het volgende:

[..]
Waarom trouwens geen == gebruiken? Er zijn best wel veel gevallen waarin je dat gewoon nodig hebt. Als je objecten op inhoud wilt vergelijken, kies je uiteraard voor equals :) .
Zou gauw je gaat werken met == dan krijg je enorm veel problemen met gedeserialiseerde objecten :) En het is een zeer traumatische ervaring om die dingen er allemaal uit te halen.

dit is mijn standaard equals
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public boolean equals(Object item)
{
   if(item == null)
     return false;

   if(item == this)//lekker snel :)
     return true;

   if(!(item instanceof DezeClasse))
     return false;

   DezeClasse otherDezeClasse = (DezeClasse)item;

   //en nu een inhoudelijke vergelijking..
   //of andere vorm van identificatie vergelijking..
}

Persoonlijk vind ik het een slechte programmeer gewoonte om de == te gebruiken.

[edit] toevoeging

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 20:23 schreef mbravenboer het volgende:

[..]

Klopt helaas niet helemaal (ik ben ook een keer in die valkuil getrapt ;) ). Strings worden gedeeld, waardoor gelijke strings altijd dezelfde instanties zijn. s1 == s2 zou in dit geval dus true opleveren. Voor alle andere objecten klopt het wel :) .

Waarom trouwens geen == gebruiken? Er zijn best wel veel gevallen waarin je dat gewoon nodig hebt. Als je objecten op inhoud wilt vergelijken, kies je uiteraard voor equals :) .
dus
String s1 = "a";
String s2 = "a";

s1 en s2 de verwijzen naar hetzelfde adres? Ik vind het persoonlijk een beetje gek. Het zou namelijk harstikke langzaam zijn om elke string die je maakt gecontroleerd wordt in het systeem of er al een dergelijke string aanwezig is. Dan zou het systeem namelijk ongevraagd langzaam worden.

Het gaat denk ik alleen op voor de Strings die bij het compileren van het Java bestand gecreerd kunnen worden. Dus misschien in dit voorbeeld toch een true :)

In het voorbeeld dat hij geeft gaat het denk ik niet op..
gedeelte == "*" levert altijd false op.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Test:
code:
1
2
3
4
5
6
7
8
9
10
public class Test
{
    public static void main(String[] ps)
    {
        String s1 = "a";
        String s2 = "a";

        System.out.println(String.valueOf(s1 == s2));
    }
}

result:
code:
1
2
3
4
martin@linux:~ > javac Test.java
martin@linux:~ > java Test
true
martin@linux:~ >

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Alarmnummer: Het zou namelijk harstikke langzaam zijn om elke string die je maakt gecontroleerd wordt in het systeem of er al een dergelijke string aanwezig is.
Toch is het zo en dit zal vast wel weloverwogen gedaan zijn... Ik weet niet precies wat de argumenten hiervoor zijn.
Het gaat denk ik alleen op voor de Strings die bij het compileren van het Java bestand gecreerd kunnen worden. Dus misschien in dit voorbeeld toch een true..
Dat zullen we ook ff testen :)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 21:00 schreef mbravenboer het volgende:

[..]

Toch is het zo en dit zal vast wel weloverwogen gedaan zijn... Ik weet niet precies wat de argumenten hiervoor zijn.
Bij het parsen maakt het niet uit of ie nou even langer aan het parsen is. En je kunt door hetzelfde adres te gebruiken voor een bepaalde string er stiekum voor zorgen dat de string vergelijkingen en hashcodes een stuk sneller te produceren zijn. Dat is denk ik de overweging hiervoor. Plus je classfiles zijn weer een stukje kleiner.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Klopt idd wat je dacht:
code:
1
2
3
4
5
6
7
8
9
10
public class Test2
{
    public static void main(String[] ps)
    {
        String s1 = ps[0];
        String s2 = ps[1];

        System.out.println(String.valueOf(s1 == s2));
    }
}

result:
code:
1
2
3
martin@linux:~ > javac Test2.java
martin@linux:~ > java Test2 a a
false

Suf verschil dus, maar ook suf als je van dergelijke zaken je proggie laat afhangen ;)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 21:03 schreef mbravenboer het volgende:
Klopt idd wat je dacht:
code:
1
2
3
4
5
6
7
8
9
10
public class Test2
{
    public static void main(String[] ps)
    {
        String s1 = ps[0];
        String s2 = ps[1];

        System.out.println(String.valueOf(s1 == s2));
    }
}

result:
code:
1
2
3
martin@linux:~ > javac Test2.java
martin@linux:~ > java Test2 a a
false

Suf verschil dus, maar ook suf als je van dergelijke zaken je proggie laat afhangen ;)
Daarom geen == meer :) Werk je wel eens met gedeserializde objecten?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Alarmnummer: Daarom geen == meer :)
Eigenwijs ;) . In veel gevallen is het geen enkel punt IMHO.
Werk je wel eens met gedeserializde objecten?
Vroeger weleens gedaan. Tegenwoordig doe ik dat niet meer. Serializeren van objecten vind ik niet erg lekker werken (behalve voor RMI toepassingen uiteraard).

Liever 'serializeer' ik naar een database of XML (dat kan voor JavaBeans nu ook automagisch met 1.4.0, maar een eigen formaat vind ik toch handiger)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 21:10 schreef mbravenboer het volgende:

[..]

Eigenwijs ;) . In veel gevallen is het geen enkel punt IMHO.
Niet eigenwijzer, maar ervaring ;) Sommige dingen die ga je van zijn levensdagen niet serializen, dus dan maakt het niet zo heel veel uit.

Maar veel objecten voorzie ik toch van een weloverwogen equals. Ik kijk er vaak naar als een record met keys, en je moet weten waarop je hem kan identificeren. Bijvoorbeeld: een variable heeft oa een type en een naam, maar aangezien iedere variable een unieke naam heeft is dat alleen al voldoende om een variable op te identificeren.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 21:10 schreef mbravenboer het volgende:

[..]

Eigenwijs ;) . In veel gevallen is het geen enkel punt IMHO.
[..]

Vroeger weleens gedaan. Tegenwoordig doe ik dat niet meer. Serializeren van objecten vind ik niet erg lekker werken (behalve voor RMI toepassingen uiteraard).

Liever 'serializeer' ik naar een database of XML (dat kan voor JavaBeans nu ook automagisch met 1.4.0, maar een eigen formaat vind ik toch handiger)
Ben even met XML bezig geweest, maar vond de tutorials en documentatie vrij ontoegankelijk. Ik ga er binnenkort wel eens een keer weer naar kijken, maar vind dat je in het begin helemaal platgebombardeerd wordt met termen.

Kun je met jdk1.4 automatisch objecten naar XML converteren?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Alarmnummer: Niet eigenwijzer, maar ervaring ;)
Duh...
Sommige dingen die ga je van zijn levensdagen niet serializen, dus dan maakt het niet zo heel veel uit.
Voor de constructie hierboven, met instanties van Operation als constanten is er geen enkele reden om .equals te gebruiken. De code is onduidelijker en bovendien trager.

Ook is er zelfs af en toe een hele goede reden waarom je .equals beter niet kunt gebruiken in veel gevallen. Met == kan op null vergelijken, wat soms wel nodig is (ook in gevallen waarin je niet expliciet met null vergelijkt maar twee waarden). Bij .equals zou dit in vervelende gevallen een NullPointerException op kunnen leveren (niet omdat .equals(null) deze gooit, want dat mag niet, maar omdat null.equals(..) dit wel gooit).

Uitzonderlijk, maar wel relevant.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 21:20 schreef mbravenboer het volgende:

[..]

Duh...
[..]

Voor de constructie hierboven, met instanties van Operation als constanten is er geen enkele reden om .equals te gebruiken. De code is onduidelijker en bovendien trager.

Ook is er zelfs af en toe een hele goede reden waarom je .equals beter niet kunt gebruiken in veel gevallen. Met == kan op null vergelijken, wat soms wel nodig is (ook in gevallen waarin je niet expliciet met null vergelijkt maar twee waarden). Bij .equals zou dit in vervelende gevallen een NullPointerException op kunnen leveren (niet omdat .equals(null) deze gooit, want dat mag niet, maar omdat null.equals(..) dit wel gooit).

Uitzonderlijk, maar wel relevant.
Ok.. betrapt.. null checks die doe ik wel met de == :)
code:
1
2
3
Alarmummer nummer = telefoonbook.find("Alarmnummer");
if(nummer == null)
   System.fireAlarm();

en inderdaad, mijn equals die is inderdaad een stukje langzamer dan de ==. Maar gebruik maken van equals veroorzaakt toch minder problemen dan ==.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Alarmnummer: Ben even met XML bezig geweest, maar vond de tutorials en documentatie vrij ontoegankelijk. Ik ga er binnenkort wel eens een keer weer naar kijken, maar vind dat je in het begin helemaal platgebombardeerd wordt met termen.
Tja, het is soms ff slikken, maar meer dan de moeite waard.
Kun je met jdk1.4 automatisch objecten naar XML converteren?
Ja, dat wordt gebruikt voor long-term persistence. De resulterende code is niet al te prettig uit XML oogpunt, maar dat kan je transformeren met XSL mocht dat nodig zijn.

Voorbeeld uit de API:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="UTF-8"?>

<java version="1.0" class="java.beans.XMLDecoder">
    <object class="javax.swing.JFrame">
        <void property="name">
            <string>frame1</string>
        </void>

        <void property="bounds">
            <object class="java.awt.Rectangle">
                <int>0</int>
                <int>0</int>
                <int>200</int>
                <int>200</int>
            </object>
        </void>

        <void property="contentPane">

            <void method="add">
                <object class="javax.swing.JButton">
                    <void property="label">
                        <string>Hello</string>
                    </void>
                </object>
            </void>
        </void>

        <void property="visible">
            <boolean>true</boolean>
        </void>
    </object>
</java>

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Alarmnummer: Ok.. betrapt.. null checks die doe ik wel..
Daar doel ik eigenlijk niet op ...

Stel:
code:
1
Alarmummer nummer = telefoonbook.find("Alarmnummer");

nummer blijkt null te zijn... Je hebt nummer1:
code:
1
nummer.equals(nummer1);

Voila: NullPointerException.
code:
1
nummer == nummer1;

Zou geen NullPointer op hebben geleverd. Uiteraard moet je checken op null waarden indien nodig, maar iedereen maakt fouten en vergeet dat weleens...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 08 oktober 2001 21:27 schreef mbravenboer het volgende:

[..]

Daar doel ik eigenlijk niet op ...

Stel:
code:
1
Alarmummer nummer = telefoonbook.find("Alarmnummer");

nummer blijkt null te zijn... Je hebt nummer1:
code:
1
nummer.equals(nummer1);

Voila: NullPointerException.
code:
1
nummer == nummer1;

Zou geen NullPointer op hebben geleverd. Uiteraard moet je checken op null waarden indien nodig, maar iedereen maakt fouten en vergeet dat weleens...
Yep. Maar ik voer nooit operaties uit op null objecten. En dan heb ik liever dat hij met een NullPointerException eruit knalt dan dat ie stiekum verscholen blijft.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Alarmnummer: Yep. Maar ik voer nooit operaties uit op null objecten.
Hehe >:)

Ik doe elke avond de afwas :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18-09 18:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op maandag 08 oktober 2001 20:58 schreef mbravenboer het volgende:
Test:
code:
1
2
3
4
5
6
7
8
9
10
public class Test
{
    public static void main(String[] ps)
    {
        String s1 = "a";
        String s2 = "a";

        System.out.println(String.valueOf(s1 == s2));
    }
}

result:
code:
1
2
3
4
martin@linux:~ > javac Test.java
martin@linux:~ > java Test
true
martin@linux:~ >
hmmm, dat ze hetzelfde adres hebben klinkt logisch, heel veel compilers van andere talen doen dat ook, maar wat als je nou dit doet:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Test
{
    public static void main (String[] args)
    {
      String s1 = "a";
      String s2 = "a";

      System.out.println ("s1 == s2: " + s1 == s2);

      s2 += "bcd";

      System.out.println ("s1 == s2: " + s1 == s2);
      System.out.println ("s1 = \"" + s1 + '"');
      System.out.println ("s2 = \"" + s2 + '"');
    }
}

als ze het zelfde adres zouden hebben zou dus betekenen dat als je er 1 veranderd dat de andere ook zou moeten veranderen... Tenzij de compiler kijkt of je er een veranderd, waardoor in dit voorbeeld dus false zou uitkomen in bijde tests.

En als jullie dan toch bezig zijn, probeer het dan gelijk even met s1 en s2 als private en als public class data members. Als ze public zijn kan de compiler nooit weten wat ermee gaat gebeuren dus zal ie ze nooit naar hetzelfde object moeten laten wijzen.

'k wil het ook wel zelf proberen, maar ik heb de jdk nog niet geinstalleerd :)

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.


  • Tomatrix
  • Registratie: Juni 1999
  • Laatst online: 27-02-2025
Op dinsdag 09 oktober 2001 02:15 schreef OiSyN het volgende:

als ze het zelfde adres zouden hebben zou dus betekenen dat als je er 1 veranderd dat de andere ook zou moeten veranderen...
String is immutable; de expressie
code:
1
s2 += "bcd";

wordt door de (meeste) compiler(s) naar het volgende omgezet:
code:
1
s2 = new StringBuffer (s2).append ("bcd");

er wordt dus nieuw geheugen gealloceerd voor zowel de oude string als het gedeelte wat eraan geplakt wordt.
s1 == s2 zal dus false opleveren.

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op maandag 08 oktober 2001 20:23 schreef mbravenboer het volgende:

[..]

Klopt helaas niet helemaal (ik ben ook een keer in die valkuil getrapt ;) ). Strings worden gedeeld, waardoor gelijke strings altijd dezelfde instanties zijn. s1 == s2 zou in dit geval dus true opleveren. Voor alle andere objecten klopt het wel :) .

Waarom trouwens geen == gebruiken? Er zijn best wel veel gevallen waarin je dat gewoon nodig hebt. Als je objecten op inhoud wilt vergelijken, kies je uiteraard voor equals :) .
Helaas Marin, dat klopt ook niet helemaal!
code:
1
2
String s1 = "a";
String s2 = "a";

Wordt inderdaad vertaalt in dezelfde String
maar:
code:
1
2
String s1 = new String("a");
String s2 = new String("a");

Worden 2 verschillende geheugenadressen ;)
(vraag bij Java Certified examen)

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Vind iemand het erg als ik het niet meer volg? ;)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

We gaan beetje ot, maar je steekt er altijd weer iets van op :) En maar een enkele java topic die eindigt zoals die begint :)

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

er zijn hier gewoon 3 java gestoorden
die niets liever doen dan ouwehoeren over geheugenadressen in hun vrije tijd ;)

  • im_ik
  • Registratie: November 2000
  • Laatst online: 28-12-2025

im_ik

dat ben ik dus

idd alle java-people op een rijtje hiero :)
Op maandag 08 oktober 2001 21:24 schreef mbravenboer het volgende:
[code]XML-CODEcode]
Maar zie ik dit goed ...
Zit er in 1.4 een Gui -XML parse... :)
Daar heb ik lang naar gezocht voor 1.3 (1 gevonden maar $$$ )
Anders ga ik direct over naar 1.4 :)

Atari Terminator AI - LegoBlockX3 = ᒢᐩᐩ.ᒡᒢᑊᒻᒻᓫᔿ.ᣳᣝᐤᣜᣳ.ᐪᓫᣗᔿᑊᣕᣔᐪᐤᣗ.T008ᖟ


Verwijderd

[me=11648]moet toch eens Java-kennis gaan afstoffen :o
[/me]
wasigh:
code:
1
2
String s1 = "a";
String s2 = "a";

wordt inderdaad vertaalt in dezelfde String
En daarna wordt met
code:
1
s2 = "blaat";

pas aparte geheugenruimte voor s2 gevraagd? :? (Ik laat het rode maar zo, wel mooi eigenlijk :+)

Edit: never mind, meer koffie doet wonderen. :)

Voor de mensen die nog koffie moeten drinken: strings zijn immutable en er moet dus sowieso ...

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op dinsdag 09 oktober 2001 11:43 schreef Arien het volgende:
[me=18993]moet toch eens Java-kennis gaan afstoffen :o
[..]

En daarna wordt met
code:
1
s2 = "blaat";

pas aparte geheugenruimte voor s2 gevraagd? :? (Ik laat het rode maar zo, wel mooi eigenlijk :+)
yep, Strings zijn immutable ( :? ) dat wil zeggen dat elke wijziging aan een String een nieuw object opleverd ;)

Verwijderd

Hmmzzz... nu ziet het er wel heel dom uit :o

wasigh, het kwartje was (wat laat) al gevallen, maar bedankt. :)
Pagina: 1