Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的受保护字段替代方案?_Java_Protected - Fatal编程技术网

Java中的受保护字段替代方案?

Java中的受保护字段替代方案?,java,protected,Java,Protected,我有一个在超类中使用保护字段的代码。我怎样才能避免它,因为我认为所有的领域都应该是私有的 /** "Abstract Builder" */ abstract class PizzaBuilder { protected Pizza pizza; public Pizza getPizza() { return pizza; } public void createNewPizzaProduct() { pizza = new Pizza(); } pub

我有一个在超类中使用保护字段的代码。我怎样才能避免它,因为我认为所有的领域都应该是私有的

 /** "Abstract Builder" */
 abstract class PizzaBuilder {
    protected Pizza pizza;

    public Pizza getPizza() { return pizza; }
    public void createNewPizzaProduct() { pizza = new Pizza(); }

    public abstract void buildDough();
    public abstract void buildSauce();
    public abstract void buildTopping();
 }

 /** "ConcreteBuilder" */
 class HawaiianPizzaBuilder extends PizzaBuilder {
    public void buildDough()   { pizza.setDough("cross"); }
    public void buildSauce()   { pizza.setSauce("mild"); }
    public void buildTopping() { pizza.setTopping("ham+pineapple"); }
 }

 /** "ConcreteBuilder" */
 class SpicyPizzaBuilder extends PizzaBuilder {
    public void buildDough()   { pizza.setDough("pan baked"); }
    public void buildSauce()   { pizza.setSauce("hot"); }
    public void buildTopping() { pizza.setTopping("pepperoni+salami"); }
 }
在子类中使用
getPizza()

因此:

变成

public void buildDough()   { getPizza().setDough("cross"); }

你可以随时让夏威夷和辣味比萨制造商公开,并保护比萨场地

public abstract class PizzaBuilder {
    protected Pizza pizza;
    ...
 }

 /** "ConcreteBuilder" */
 public class HawaiianPizzaBuilder : PizzaBuilder {
     ...
 }

 /** "ConcreteBuilder" */
 public class SpicyPizzaBuilder : PizzaBuilder {
     ...
 }

您对评论的回应如下:


@洛根:谢谢你的回答,但是所有类都可以通过setter/getter方法访问这个字段。但我认为这个解决方案比原来的更好

如果您想停止这种操作,那么答案可能是更改getter方法的可见性,而不提供setter


实际上,整体设计看起来有点奇怪。您有一个
create
方法,它不返回它所创建的对象,并且子类的构建方法没有明显的调用方式。(也许您应该“查看”Factory对象设计模式。)


在这个层次上重新思考可以清楚地表明,
pizza
变量及其getter可以而且应该从外部视图中隐藏。

您可以通过改变想法来避免这个问题。按预期的方式使用受保护字段没有什么错。你能在超类中编写一个setter和getter,然后使用super.getter方法访问它们吗?@MichaelMyers:谢谢你的回答。但是这段代码允许同一个包中的所有类访问这个受保护的字段,这可能很危险。@Logan:谢谢你的回答,但是所有类都可以通过setter/getter方法访问这个字段。但我认为这个解决方案比原来的更好。这没有任何意义。私人“pizza”成员在没有某种访问权限(无论是受保护的还是getter/setter方法)的情况下,HawaiianPizzaBuilder或SpicyPizzaBuilder都无法访问。对,我的意思是受保护的。很抱歉
public abstract class PizzaBuilder {
    protected Pizza pizza;
    ...
 }

 /** "ConcreteBuilder" */
 public class HawaiianPizzaBuilder : PizzaBuilder {
     ...
 }

 /** "ConcreteBuilder" */
 public class SpicyPizzaBuilder : PizzaBuilder {
     ...
 }