簡體   English   中英

Java中的受保護領域替代方案?

[英]Protected field alternatives in Java?

我在超級類中有一個使用保護字段的代碼。 我認為所有領域都應該是私有的,我該如何避免呢?

 /** "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()   { pizza.setDough("cross"); }

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

您總是可以公開展示夏威夷和辣比薩制造商,並保護比薩領域。

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

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

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

您因此回應評論:

@Logan:感謝您的回答,但是所有類都可以通過setter / getter方法訪問此字段。 但是我認為這種解決方案比原來更好。

如果要停止此操作,那么答案可能就是更改getter方法的可見性,而根本不提供setter。


實際上,總體設計看起來有些奇怪。 您有一個create方法,該方法不會返回它創建的對象,並且沒有明顯的方法可以調用子類的build方法。 (也許您應該“查看” Factory Object設計模式。)

在此級別上進行重新思考將清楚地表明, pizza變量及其吸氣劑可以並且應該從外部隱藏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM