Jeremy Rayner on java and other stuff.

All | AudioDrama | Chatter | Fun | Groovy | Java | Life

braindump("Java Properties are a faff")
Posted on 09 Oct 2003
Problem: Standard JavaBean properties
this is currently a bit of a faff!! (I told you I was lazy)

private String foo;
 
public String getFoo() {
return foo;
}
 
public void setFoo(String foo) {
this.foo = foo;
}

Most of the time I want to code this in one line (Java Language change!) so the above would become the succinct:

String -rw foo;

How: implement as a pre-processor...
Why Not:
is this in xdoclet/groovy/ant regexp task/generic pre processor already?
No point creating non-standard language features
Maintainence burden increased as yet another oddity introduced to your codebase
'cos I'd be biled for being silly :)

What modifiers do I propose?

 nonegetsetget+set
private--r-w-rw
protected##r#w#rw
package**r*w*rw
public++r+w+rw

Why not try to create solution in Valid Java
try for valid java?

String foo-rw; --> private String foo
String foo*rw; --> public String foo // this is probably not valid
 
foo-rw += foo-rw; --> setFoo(getFoo() + getFoo()); // hard transformation...

invalid java?

String -rw foo;
String +rw foo;
 
foo += foo; --> setFoo(getFoo() + getFoo()); // hard ...
 
setFoo(getFoo() +getFoo()); // no transformation, but won't compile/editors barf...
Either way we still have issue with usage of getters/setters, so assume that the usage of getters/setters is outside scope of preprocessor, the choice is between which looks nice and which will not be highlighted as a problem in editors.

Additional issues

  • Collection properties
  • boolean properties
  • Could also indicate that property is parameter to constructor

Suggested Implementation

  • Implement a preprocessor that takes a single java file from a URI as input and a destination URI as output.
  • Wrap ant task around preprocessor that basically does :-

    <target name="compile" depends="init" >
    <!-- This is the new ant task being called -->
    <jpp include="${src.dir}/**/*.java"
    outputdirectory="${pre.processed.src.dir}"/>
     
    <javac srcdir="${pre.processed.src.dir}"
    destdir="${build.classes.dir}"
    classpathref="project.classpath"/>
    </target>

But really, why bother?
so that this sort of thing...

package com.foo.bar;
public class FooBar {
private String foo;
protected boolean bar;
 
public String getFoo() {
return foo;
}
 
public void setFoo(String foo) {
this.foo = foo;
}
 
public boolean isBar() {
return bar;
}
}
becomes the lazy but readable...
package com.foo.bar;
public class FooBar {
String -rw foo;
boolean #r bar;
}
foo property has private access, has a getter and setter
bar property has protected access, only has getter

Questions to the reader of this braindump...

What do you people think?
Has this been done already?

09 Oct 2003 |

 

 
October 2003
SunMonTueWedThuFriSat
      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
Prev | Today | Next

rss:subscribe (All)



What I'm reading
my feed aggregator ->box

My websites
London Java Meetups
Programming Projects
Elite in Java
megg
Blogmento
Jez's Photos
Fantasy Stock Market
Cool Saxophonist
Doctor Who Audios
Pisces Audios

Other Blogs
Mike Cannon-Brookes
James Strachan
Joe Walnes
Sam Dalton
Simon Brown
Cameron Purdy
Mike Roberts
Erik C. Thauvin
John Martin
Manfred Riem

B5 d++ t++ k s+ u- f
i+ o+ x-- e+ l- c--

powered by blogmento