静态工厂方法-返回任何子类型

时间:2019-11-05 20:50:55

标签: java effective-java

我正在阅读有效的Java和Joshua Bloch这本书,在第二章中说:

  
    

静态工厂方法的第三个优点是,与构造函数不同,它们可以返回其返回类型的任何子类型的对象。

  

我不知道如何在实践中使用这个概念?

有人可以举一个例子。

2 个答案:

答案 0 :(得分:4)

1。从客户端隐藏(更好地封装)对象创建

这是所谓的“简单工厂”(又称参数化工厂)的示例:

public class UserFactory {

    public static User newUser(UserEnum type){
        switch (type){
            case ADMIN: return new Admin();
            case STAFF: return new StaffMember();
            case CLIENT: return new Client();
            default:
                throw new IllegalArgumentException("Unsupported user. You input: " + type);
        } 
    }
}

将对象创建封装到静态工厂中的目的在于,用户不知道(也不在乎)如何创建对象:

// client code - give me an admin object, 
// don't care about the inner details of how it gets constructed
User admin = UserFactory.newUser(ADMIN); 

2。灵活地交换实施方案而不会破坏客户端代码

考虑此静态工厂方法:

// swap out with LinkedList later if you like, 
// it won't break the 100 places that invoke this method
public static List<String> getMyList(){
    return new ArrayList<>(); 
}

不喜欢任何标准列表实现,而是在一段时间后创建自己的列表吗?

public class MyMuchBetterList<E> extends AbstractList<E> implements List<E> {

    // implementation
}

没问题,您仍然可以在静态工厂内交换,而不会影响那些使用getMyList的人:

public static List<String> getMyList(){
        return new MyMuchBetterList<>(); // compiles and works, subtype of list
    }

答案 1 :(得分:1)

例如,考虑要编写自己的选项类型。您可能有一个带有两个实现类MyOptionPresent的接口Absent。然后,您可能希望使用静态工厂方法将可能为空的值转换为MyOption对象。可能看起来像这样:

public static <T> MyOption<T> ofNullable(T value) {
    if(value == null) {
        return new Absent<>();
    } else {
        return new Present<>(value);
    }
}

请注意,静态工厂方法MyOption.ofNullable(value)根据参数的值返回不同的对象类。编写new MyOption<>(value)具有相同行为的构造函数是不可能的。

相关问题