gpt4 book ai didi

java - 添加 protected 构造函数以允许子类提供不同的实现

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:42:48 25 4
gpt4 key购买 nike

我有以下接口(interface)(为简单起见省略了一些方法):

public interface Container{

public void put(String s, Object o);
public Object get(String s);

}

及其实现:

public class ContainerImpl implements Container{

private Map<Stirng, Object> m;

public ContainerImpl(){
m = new HashMap<>();
}

//This constructor is used in the case if a client is not satisfied
//by the HashMap, e.g. in case of Enum it's better to use EnumMap
protected ContainerImpl(Map<String, Object> m){
this.m = m;
}

public void put(String s, Object o){
m.put(s, o);
}
public Object get(String s){
m.get(s);
}
}

我的问题是提供这样一个 protected 构造函数是否与封装相悖。事实上,我们向客户提供了一些我们在内部使用 Map 的信息。如果 dataStructure 发生变化,我们将不得不从作为参数传递的 map 执行转换,我认为这可能会导致一些错误。

最佳答案

if providing such a protected constructor contraries to incapsulation.

你是对的,它确实与 ContainerImpl 的封装行为相矛盾。

恕我直言,这是一个设计决定; class 是否旨在强制封装或暴露给客户/调用者以支持各种构造。

例如:

A: ContainerImpl 只有 default-constructor 意味着 Container 的内部存储完全由它控制concrete-implementation 和调用者不能选择不同的存储。

乙:ContainerImpl

protected ContainerImpl(Map<String, Object> m)

表示调用者可以选择基于Map 存储的性质,即TreeMapHashMapLinkedHashMap 或自定义实现。

选择上述方法之一的决定将基于客户的需求和性质。

关于java - 添加 protected 构造函数以允许子类提供不同的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32922141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com