2013-06-17 11 views
7

La sintassi per le stringhe di formato di Java può complicarsi, per esempio:Esiste una libreria che fornisce un modo fluido per costruire stringhe di formato Java?

"|%1$-10s|%2$-10s|%3$-20s|\n" 

Sembrerebbe essere maturi per qualcuno per creare un DSL fluente per aiutare con la costruzione di queste stringhe di formato (simile a quello che Jooq fa per SQL).

Esiste una cosa del genere?

+1

Buon punto. Ho pensato a questa libreria molte volte. Probabilmente vuoi implementarlo? Sarei felice di usare questa libreria. – AlexR

+0

C'è uno speciale vantaggio del fluflu in una fase iniziale: qualsiasi utilizzo è molto gradito e ascolto attivamente le esigenze degli utenti. Se trovi qualche caratteristica mancante o non molto utile, sono aperto a discutere e rilasciare una nuova versione di fluflu che accolga nuove funzionalità. –

risposta

5

È possibile creare tale API utilizzando fluflu, un generatore API fluente, che è stato ispirato dall'API jOOQ's e dallo jOOQ's underlying API design techniques.

Fluflu offre annotazioni che vengono elaborate utilizzando gli strumenti APT per generare un'API fluente dall'implementazione dell'API. Le annotazioni modellano una macchina a stati finiti. Ecco un esempio dalla loro wiki:

@Fluentize(className = "CoreClass", startState = "State0", startMethod = "start") 
public abstract class ToBeFluentized implements Cloneable { 

    @Transitions({ 
     @Transition(from = "State0", end = true), 
     @Transition(from = "State1", end = true) 
    }) 
    public void end() { 
    } 

    protected String with = null; 
    protected List<byte[]> b = new LinkedList<>(); 

    @Transition(from = { "State0", "State1" }, to = "State0") 
    public abstract ToBeFluentized with(
     @AssignTo("with") String a, @AddTo("b") byte[] b 
    ); 

    @Transition(from = "State1", to = "State0") 
    public ToBeFluentized z() { 
     return this; 
    } 

    Set<Integer> j = new HashSet<>(); 
    @Transition(from = "State1", to = "State1", name="a") 
    public abstract ToBeFluentized z(@AddTo("j") int j); 

    @Transition(from = "State0", to = "State1") 
    public ToBeFluentized a() { 
     return this; 
    } 

    @Transition(from = "State0", to = "State1") 
    public ToBeFluentized b() { 
     return this; 
    } 

    @Transition(from = "State0", to = "State1") 
    public ToBeFluentized vari(String... strings) { 
     return this; 
    } 
} 

Questo può quindi essere utilizzato come tale:

State0 c = CoreClass.start().a().z(); 
State0 d = c.b().with("z", "z".getBytes()); 
State0 e = c.b().with("q", new byte[]{0,0,1}); 
d.end(); 
e.end(); 

Naturalmente, avrai ancora di scrivere l'attuazione :-)

+0

Wow! Grazie. Molto interessante! – AlexR

+0

@AlexR: È ancora in uno stato iniziale, ma molto promettente. Scrivere una buona API fluente può essere molto noioso. Questo strumento potrebbe sicuramente aiutare –

Problemi correlati