将对象从一个私有方法传递到另一个私有方法

Posted

技术标签:

【中文标题】将对象从一个私有方法传递到另一个私有方法【英文标题】:Passing objects from one private method to another 【发布时间】:2012-10-11 05:32:12 【问题描述】:

我已经编程了一段时间了,我有一个关于公共方法使用的问题。我正在开发一个自动售货机程序,我有一个私有方法setUpMachine() 来初始化游戏并设置对象。我有另一个私有方法startMachine() 启动游戏并提示用户输入。然后它将输入传递给另一个私有方法checkInput(),该方法检查输入是否有效......但这不是我遇到的“问题”,而是我没有做某事的奇怪感觉正确。对于我的第三种方法checkInput(),我需要访问第一种方法setUpMachine() 中的对象。问题是我有很多对象(糖果、薯条、苏打水、饼干),并且将它们全部传递给检查周边似乎并不正确。换句话说,这样做:

checkInput(FoodType candy, FoodType chips, FoodType soda, FoodType cookie)

似乎不对。这是否意味着,如果我使用私有方法,每次我想使用它们时都必须传递对象?我读到公开方法是不好的做法。

对此的解释会很好,与其说是告诉我我的编码效率低下的解释,不如说是描述何时如何使用私有方法的解释,或者如果有其他方法可以做到这一点。

【问题讨论】:

如果这些对象将出现在类的所有方法中(或大部分方法中),那么您可以将它们设置为类中的属性,并将它们提供给构造函数上的实例。跨度> 所以如果我要在整个类中使用对象,可以在 setUpMachine() 方法之外初始化对象,而只是在类中?那么 setUpMachine() 方法还有必要吗? 您也可以在setUpMachine 中设置类属性。这将取决于您的设计,但 IMO 最好在构造函数中执行此操作,以避免在您之前设置它们之前在方法中使用这些属性。 是的,它们可以是类上的静态变量或实例变量——private 方法不能在类本身之外调用,但可以访问类的所有属性。更多信息 - protected 可在包中访问,public 可全局访问。 好的,这真的很清楚。谢谢你:) 【参考方案1】:

如果您不想传递对象,可以将它们配置为实例变量:

public class VendingMachine 
    private FoodType candy;
    private FoodType chips;
    private FoodType sodas;
    private FoodType cookies;

    private static String errorMessage = "A really bad error occurred.";

    public VendingMachine()
        this.setupMachine();
    

    private void setUpMachine()
        this.candy = new FoodType();
        this.chips = new FoodType();
        this.sodas = new FoodType();
        this.cookies = new FoodType();
    

    private boolean checkInput()
        if (this.candy==null || this.chips==null || this.sodas==null || this.cookies==null)
            return false;
        else
            return true;
    

    public void doSomething() throws Exception() 
        if (!this.checkInput()) throw new Exception(VendingMachine.errorMessage);
        // do things
    

这个类可以被称为

VendingMachine vendingMachine = new VendingMachine();
try 
    //vendingMachine.checkInput() is not available because it is private
    vendingMachine.doSomething(); // public method is available
 catch (Exception e)
    // validation failed and threw an Exception

【讨论】:

【参考方案2】:

一般来说,当你想向外界公开某些东西时,应该使用公共方法。通常,它是一种更高级别的方法,其中私有方法用于提供详细信息。私有方法可以轻松更改,而不会影响公共方法不能影响的其他类。

考虑这个例子

public void run() 

  setUpGame();
  validateInput();
  doSomethingInteresting();
  endGame();
  notifyUserGameIsComplete();


在本例中,run 是公开的,但其他方法都不是。这是因为公共方法的调用者只知道他们想要运行游戏,而不关心游戏的具体运作细节。

拥有许多私有方法是可以肯定的。方法应该是单一的,每个只做一件事。这使您可以更轻松地阅读、调试和维护代码。

如果多个方法需要共享数据,可以将它们声明为类的成员变量。这意味着它们是班级的状态。例如:

public class Person 
   private String name;

   public String getName()  return name; 
   public boolean nameMatches(String pattern)  // do some regex testing against the name 

在本例中,methds 共享对name 的访问权限,而name 是该人的一部分。

如果你真的需要传递一堆参数,你可以创建一个对象来保存所有这些参数。因此,您可以创建一个数据传输对象,而不是传递 param1、param2、param3 等,例如

class MyStuff 
   private final String param1;
   private final String param2;
   private final String param3;

现在您可以传递MyStuff 以方便使用,而不是列出单个参数。

希望这有助于增加一些清晰度。

【讨论】:

【参考方案3】:

私有方法对外部世界是不可见的。您只能从同一类的方法中调用私有方法。

私有方法可用于在逻辑上将一个大方法分解为多个较小的部分(步骤)。

此外,如果您有一些代码似乎在您的类中的多个方法中重复,那么您可以使用私有方法。

如果对象也是类中的字段,则不需要将对象定义为私有方法的参数,但如果不是,则必须这样做。

【讨论】:

以上是关于将对象从一个私有方法传递到另一个私有方法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 bind() 创建隐私

Python中的面向对象(高级)之私有方法、多继承、多态

c#标签从私有方法(工具箱值)接收信息

为啥我能够从在同一对象的另一个实例上调用的方法访问一个实例的私有实例变量? [复制]

私有属性私有方法

92.私有属性和私有方法