【问题标题】:Passing an array of Strings from inside a Static Function in a different class to another class将不同类中的静态函数内部的字符串数组传递给另一个类
【发布时间】:2016-11-13 01:40:33
【问题描述】:

我正在尝试从“BuildOrder”类中获取数组“t”、“p”和“s”到另一个类。以下是参考代码:

我尝试创建方法来返回它们并在另一个类中检索它们,但我不知道如何去做。我正在尝试将装饰器模式添加到复合模式的基本代码中 这里的组件是复合模式的接口

package composite;

public class BuildOrder {

public static Component getOrder()
{
    Composite order = new Composite( "Order" ) ;
    order.addChild(new Leaf("Crispy Onion Strings", 5.50 ));
    order.addChild(new Leaf("The Purist", 8.00 ));
    //Composite customBurger = new Composite( "Build Your Own Burger" ) ;


    String[] t={"Bermuda Red Onion","Black Olives","Carrot           Strings","Coleslaw"};

    String[] p={"Applewood Smoked Bacon"};

    String[] s={"Apricot Sauce"};

    /*customBurger.addChild(new Leaf("Beef, 1/3 lb on a Bun",9.50 )); // base price for 1/3 lb
    customBurger.addChild(new Leaf("Danish Blue Cheese", 0.00 )); // 1 cheese free, extra cheese +1.00
    customBurger.addChild(new Leaf("Horseradish Cheddar", 1.00 )); // extra cheese +1.00
    customBurger.addChild(new Leaf("Bermuda Red Onion", 0.00 )); // 4 toppings free, extra +.75
    customBurger.addChild(new Leaf("Black Olives", 0.00 )); // 4 toppings free, extra +.75
    customBurger.addChild(new Leaf("Carrot Strings", 0.00 )); // 4 toppings free, extra +.75
    customBurger.addChild(new Leaf("Coleslaw", 0.00 )); // 4 toppings free, extra +.75
    customBurger.addChild(new Leaf("Applewood Smoked Bacon", 1.50 )); // premium topping +1.50
    customBurger.addChild(new Leaf("Apricot Sauce", 0.00  )); // 1 sauce free, extra +.75
    order.addChild( customBurger );*/
    return order ;

}
    public String[] gettoppings()
    { return t;
    }
     public String[] getpremium()
    { return p;
    }
    public String[] getSauces()
    { return s;
    }
}

//following is the class where I want to use the above strings 
public class Sauce implements LeafDecorator
{
public String Sauce()
{   BuildOrder bo=new BuildOrder();
    String[] order=bo.getSauces(String[] s);

}
}

【问题讨论】:

  • public String gettoppings(String t) { return t; 有什么用? } ?它直接返回输入?
  • @HendrikT 这是我尝试做一个 getter 方法。

标签: java arrays string design-patterns decorator


【解决方案1】:

在这个例子中似乎不止一个不匹配。

您定义类变量...

String[] t;
String[] p;
String[] s;

但随后您在 getOrder() 方法中再次定义它们——覆盖该方法范围内的类级变量。

注意:按照您拥有它们的方式,这些变量是包私有的(默认访问说明符)。我可能会选择private

gettoppingsgetpremiumgetSauces 方法(在 BuildOrder 类中)毫无意义——它们总是返回它们所传递的内容。

Sauce 类看起来无法编译。这应该编译(取决于LeafDecorator)...

public class Sauce implements LeafDecorator {

    public String Sauce() {
        BuildOrder bo = new BuildOrder();
        String order = bo.getSauces("some string -- what's this for?");
    }

}

order 字符串将等于“某个字符串——这是干什么用的?”。

【讨论】:

  • 我同意你指出的第一件事。我不应该在 getOrder() 函数中再次声明它们。我修复了它并仅在 getOrder() 中声明了它们,但是当我尝试将他的访问说明符更改为私有时,我收到一条错误消息,指出表达式的非法开始。
  • 在 Sauce 类中,代码行 String[] order = bo.getSauces("some string -- 这是干什么用的?");我正在尝试将数组“order”设置为 getOrder() 中的数组“s”。这是我的最终目标..这就是我问这个问题的原因。我还注意到我混淆了数组 't' 'p' 和 's' 是一个字符串。所以我改变了它..在这里的 cmets
  • 如果您在getOrder() 内声明tps,它们将仅存在于其中,并且仅在方法调用的生命周期内存在。 (公共/私有/受保护也不能应用于定义在方法内部的变量......只能应用于类级变量。)如果这些东西需要比方法调用更长寿——并且需要在方法调用之外访问——它们必须是班级成员。
  • 所以,如果我在函数 getOrder() 之外声明它们,但在此函数内部初始化它们;我不能在另一个类中使用这些初始化值..即使在同一个类中使用这些 getter 方法?
  • 如果你在方法外声明它们,然后在方法内设置它们的值,这些值将在方法完成后保持设置。
【解决方案2】:

如果您想获取这些字段的值,您可以简单地将 getter 添加到类“BuildOrder”中,该类将返回不同的变量。

如果您使用的是 IntelliJ,只需按 Alt+Insert,然后选择“Getter”,突出显示 3 个变量并按 Enter。

您也可以简单地将这些变量设置为公共(在它们前面添加“public”),例如通过使用“bo.t”来访问它们。

【讨论】:

  • 我尝试将访问说明符更改为公共,但我收到错误“表达式的非法开始”,我正在使用 BlueJ。
【解决方案3】:

我正在尝试将数组“t”、“p”和“s”从“BuildOrder”类获取到另一个类。

要从另一个类(对象)获取变量,您可以将元素设为公共并以 objectOfClass1.variable1 的身份访问它,或者将它们设为私有,然后创建一个 getter 和 setter(如果需要),这样您就可以拥有

objectOfClass1.setVariable1("hello");  

设置该变量,然后让你这样做

String var = objectOfClass1.getVariable1();

注意签名,与您的代码不同,getter 通常不带参数并返回一个值,所以

public String getVariable1(){ 
  return variable1; 
}

public void setVariable1(String s){
  this.variable1 = s;
}

编辑根据您上次的更改。

首先你要声明变量 String [] t;在你的方法中。因此,它将在对象级别不可用。因此您的吸气剂将无法访问。

我不想给你确切的代码。不过,我会给你大致的想法。

public class myclass{

  String [] a;

  public void myInitializer(){
     a={"Hello","Bye"};
  }
  public String [] getA(){
    return a;
  }
}

这就是您应该如何构建代码的方式。

我注意到的第二件事是您的 main 方法应该返回 Component,但是您返回的是 Composite。这不会编译(除非它的类型相同)。

  public static Component getOrder()
  {
    Composite order = new Composite( "Order" ) ;
    return order ;
  }

此外,您的 Sauce 构造函数正在调用 bo.getSauces(String [] s)

您没有一个名为 getSauces 的方法可以接受 String [] 的参数,因此它不会再次编译。你需要这样称呼它。

String[] order=bo.getSauces();

【讨论】:

  • 我不需要 setter 方法,因为我已经初始化了它们。这些应该是数组而不是字符串,因此在代码中进行了上述更改。据我所知,我已经进行了一些更改。请查看并给我留下更多的 cmets。
  • 修改了我的答案。我相信我已经回答了您关于如何访问变量值的原始问题。
猜你喜欢
  • 1970-01-01
  • 2021-12-12
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 2019-07-14
相关资源
最近更新 更多