Sylvain Wallez wrote:


But I think it can even get easier:
1. Let's just assume that every component is ThreadSafe - unless
otherwise stated - no need to declare the interface anymore. I think
apart from the interpreter most components are threadsafe or poolable
anyway.


This is a huge change compared to the current behaviour, where no interface means not threadsafe and not reusable. IMO, this change can only happen if we completely move away from Avalon.

This is not the "safe" assumption, and can cause unexpected side-effects in user's code. This is not a 2.x change.


2. Let's remove support for pooled components - yes, seriously. Fiddling
with the pool sizes is really annoying. We have a working factory
approach for sitemap components, so why not simply use it overall? And
rewriting the remaining pooled components shouldn't be that hard. (I now
that we are proxying pooled components to simplify the lookup, but you
still have to configure pool sizes).


+1 for generalizing the factory pattern. Cocoon spends way too much time in checking Avalon's lifecycle interfaces and parsing configuration objects.


Well, a better pool like the MPool package at D-Haven will help. MPool is the managed pool that will shrink pool sizes at a slower rate, removing the need to think about pool sizes in general (i.e. no deferring back to factory method).

The big thing about Avalon based components is the startup time due to the configuration element parsing, etc.

Now, I will say that getting rid of component pooling will require a major overhaul of the Cocoon internals.


My final idea is to use even more magic (but it might be too much magic?):

class MyComponent implements SOMETHING {
  protected final ClassA component_A;
  protected final ClassB component_B;
}
When the component is instantiated all instance variables prefixed with
"component_" are setup using some injection mechanism - or perhaps using
annotations?


Hmm...
- how do you unit test Cocoon without the container? By subclassing to access the protected fields? - we can't strongly enforce the contract of subclasses by making some fields private. - the naming convention weakens the strong typing of Java. What if you write "conponent_A"? Chasing the NPE won't be easy...

Danger Will Robinson!
In addition to the reasons listed by Sylvain, you are deviating far into left field from what the average Java developer is used to.


Now, in the end I really want to write less code :)


Use Ruby :-P

Seriously, I agree that writing less code is good, but not at the price of too black magic implying weaker contracts.


Agreed. To achieve the goal of less code would require major overhauls of the entire system.