-
-
Save sebersole/976704 to your computer and use it in GitHub Desktop.
// Option 1 - Options part of MetadataBuilder which is more "natural" i think, but maybe not | |
// feasible if the binding code does know about MetadataBuilder (in which case see option 2). | |
public interface MetadataBuilder { | |
public static interface Options { | |
public boolean useNewIdentifierGenerators(); | |
... | |
} | |
... | |
public MetadataBuilder withNewIdentifierGeneratorsEnabled(boolean enabled); | |
public Options getMetadataBuilderOptions(); | |
} | |
public class MetadataBuilderImpl implements MetadataBuilder { | |
... | |
private static class OptionsImpl implements Options { | |
private boolean useNewIdentifierGenerators; // I believe the default is currently false | |
... | |
public boolean useNewIdentifierGenerators() { | |
return useNewIdentifierGenerators; | |
} | |
} | |
private final OptionsImpl options = new OptionsImpl(); | |
public withNewIdentifierGeneratorsEnabled(boolean enabled) { | |
this.options.useNewIdentifierGenerators = enabled; | |
} | |
... | |
public Options getMetadataBuilderOptions() { | |
return options; | |
} | |
} | |
// Option 2 - Options part of Metadata, specifically to make it easier to pass along to binding code afaiu. | |
// A pro of this approach is that the options used to construct a Metadata are available from it after it is built. | |
public interface MetadataBuilder { | |
... | |
public MetadataBuilder withNewIdentifierGeneratorsEnabled(boolean enabled); | |
} | |
public class MetadataBuilderImpl implements MetadataBuilder { | |
... | |
private static class OptionsImpl implements Metadata.Options { | |
private boolean useNewIdentifierGenerators; // I believe the default is currently false | |
... | |
public boolean useNewIdentifierGenerators() { | |
return useNewIdentifierGenerators; | |
} | |
} | |
private final OptionsImpl options = new OptionsImpl(); | |
public withNewIdentifierGeneratorsEnabled(boolean enabled) { | |
this.options.useNewIdentifierGenerators = enabled; | |
} | |
... | |
public Metadata buildMetadata() { | |
return new MetadataImpl( ..., options ); | |
} | |
} | |
public interface Metadata { | |
public static interface Options { | |
public boolean useNewIdentifierGenerators(); | |
... | |
} | |
public Options getMetadataOptions(); | |
} | |
I did not add withNewIdentifierGeneratorsEnabled() to the interface, just the impl (which I have corrected), so maybe that caused some confusion
Oh, right. You didn't put a return type for the withNew... method, but now I see if that returns the builder, the options wouldn't need the method I mentioned.
I expanded out the second proposal some more.
I think I prefer option 2, but it might help if you add some pseudo client code for the two options.
The client code is the same in either case:
new MetadataSource(...) .getMetadataBuilder() .withNewIdentifierGeneratorsEnabled( true ) ... .buildMetadata();
Still option 2 :-) I don't think that once Metadata is build there should be any reference to the builder.
How does this tie in with other options? I think we talked about whether we create a setter for all options or only several and have an additional property container for everything else. I guess I am talking about org.hibernate.cfg.Settings.
I'd agree, but that's exactly why I like option 1. Seems like the builder options should be accessed via the builder the user already has a reference to. What use-case might drive wanting to access these options via the Metadata interface? I'm not saying there isn't one; I just don't know what it might be.
You will need these options during the binding phase
Yes, but that's only in the impl and only during construction time.
No Options would not have a buildMetadata() method. Its purpose is a view of the config options targeting building metadata. Options is simply providing access to these config options.