java如何限制对对象的字段设置器的访问?用继承来实现这一点会是一个糟糕的选择吗?
我有一些由底层服务(比如数据存储库)创建的业务数据对象。这些对象是逐步创建的。i、 e(第一步仅从google查找图像对象,第二步检索关于图像的元数据,第三步将其下载到磁盘)
这些相同的对象将在构建时在UI中呈现。因此UI不需要了解任何关于setter的信息,也不应该访问它
但是创建实例的服务需要访问setter。请注意,此模型将从其他包中使用,因此将setters包设为私有不是一个解决方案
以下是代码方面的要求:
图像模型:
class Image {
private String src;
public String getSrc(){
return field;
}
public void setSrc(String src){
return src;
}
}
服务模式:
interface IService {
Image get(...);
Image processMore(Image i);
}
用户界面/客户端代码:
Image i = service.get(params);
render(i);
i = service.processMore(i);
render(i);
i.setSrc(null); //This is the problem. Client should not have access to this method.
可能的解决方案:
解决方案1:接口
public interface IImage{
String getSrc();
}
interface IService {
IImage get(...);
IImage processMore(Image i);
}
IImage i = service.get(params);
render(i);
i = service.processMore(i);//Casting IImage to Image - this cast can easily fail and no way to know IImage is always an Image
render(i);
后退:我已经评论过的铸造问题。对于每个对象,还必须编写大量样板代码。当图像模型被扩展时,这将变得非常复杂
解决方案2:构建器模式
又是很多样板代码。但严格来说,构建器模式不适合这里,因为对象是分步骤构建的,我们必须对构建器类调用getSrc(),这可能违反了书中的某些内容
解决方案3:继承
public abstract class Image {
protected String src;
protected Image() {} //Ensure this class instance is never created
public String getSrc(){
return field;
}
protected void setSrc(String src){
return src;
}
public static class Buildable extends Image {
protected String src;
public Buildable() {
super();
}
@Override
public void setSrc(String src){
return src;
}
}
}
interface IService {
Image get(...);
Image processMore(Image.Buildable i);
}
Image i = service.get(params);
render(i);
i = service.processMore(i);//Casting Image to Image.Buildable - as Image constructor is protected and Image.Builder is public, only way to create Image is creating Image.Buildable and hence this cast should never fail.
render(i);
所以作为一个正在学习SOLID principal的初学者,我的问题是
- 此继承模型是否违反了SOLID(或其他干净的代码准则)?如果是,应该如何做李>
共 (0) 个答案