有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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的初学者,我的问题是

  1. 此继承模型是否违反了SOLID(或其他干净的代码准则)?如果是,应该如何做

共 (0) 个答案