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 {
...
}