Design: Convention, Status: Accepted
This page describes the structures and conventions used to initialize a class.
Static factory methods are preferable than constructors for the following reasons:
// With static factory method, giving a hint that a foobar provider with default settings is being created. FoobarProvider defaultProvider = FoobarProvider.defaultFoobarProvider(); // With constructor FoobarProvider defaultProvider = new FoobarProvider();
There are a few disadvantages of static factory methods:
create()
and smart IDEs such as IntelliJ and Eclipse can also give hints and help auto-completing.In general, we should favor static factory methods over constructors.
public class DefaultCredentialsProvider implements AwsCredentialsProvider, SdkAutoCloseable { private static final DefaultCredentialsProvider DEFAULT_CREDENTIALS_PROVIDER = new DefaultCredentialsProvider(builder()); private DefaultCredentialsProvider(Builder builder) { this.providerChain = createChain(builder); } public static DefaultCredentialsProvider create() { return DEFAULT_CREDENTIALS_PROVIDER; } public static Builder builder() { return new Builder(); } public static final class Builder { // ... } // ... } // There are two ways to create new instance DefaultCredentialsProvider defaultCredentialsProvider1 = DefaultCredentialsProvider.create(); DefaultCredentialsProvider defaultCredentialsProvider2 = DefaultCredentialsProvider.builder().build;
The naming conventions for the static factory methods:
create()
, create(params)
when creating a new instance eg: DynamoDBClient.create()
defaultXXX()
when returning an instance with default settings. eg: BackoffStrategy.defaultStrategy()