【问题标题】:java return from private method to publicjava从私有方法返回到公共方法
【发布时间】:2011-09-29 17:28:42
【问题描述】:

我有一个公共方法和一个私有方法。它们都应该返回 int 值。私有方法是完成所有工作的方法,而公共方法是从主程序调用的方法。公有方法如何返回私有方法返回的结果?

是这样的

public int longer()
{
  longer(a.length);
}

private int longer(int n)
{
  int index

  //find largest index recursively 
  //make recursive call longer(n-1)
  return index;
}

我想将它传递给公共方法,然后从那里返回。我是否可以通过说 return long.index 从公共方法中返回它?或类似的东西?

我想我应该澄清一下。 n 不是索引。 idnex 是根据传入方法的内容计算的。 public 和 private 是因为它将是一种递归方法。我将编辑我在上面发布的内容,以使其更准确地了解我正在尝试做的事情。传入一个数组并递归处理它。

【问题讨论】:

  • 如果签名相同,为什么还有私有方法呢?
  • @AndyPryor:黑匣子。调用者不需要访问类的所有内部工作。

标签: java methods return


【解决方案1】:
public int longer()
{
    return longerInternal(a.length);
}

private int longerInternal(int n)
{
    int index

    //find largest index recursively 
    //make recursive call longer(n-1)
    return index;
}

从您的public 方法,您可以调用private 方法。我重命名了 private 方法,这样您的方法就不会发生命名冲突。一个简单的实现应该是这样的:

public class MyClass {
    private int[] a;

    public MyClass(int[] _a) {
        a = _a;
    }

    public int longer()
    {
        return longerInternal(a.length);
    }

    private int longerInternal(int n)
    {
        int index;
        //do recursive call
        return index;
    }
}

而且可以这样调用:

MyClass myClass = new MyClass(new int[]{1,2,3,4,5,10});
int result = myClass.longer();

【讨论】:

    【解决方案2】:

    首先,您可能需要更好的函数名。

    您将调用您的public 函数getLonger(int n),然后将其传递给您的私有longer(int n) 函数。当这个函数完成后,它会返回getLonger(int n),然后返回给调用者。

    【讨论】:

    • get 前缀适用于 访问器。这里它在做一些计算,我绝对不会把它命名为getLonger
    • 你怎么知道它不是访问器?这就是 cmets 似乎建议的“递归查找最大索引/使递归调用更长(n-1)”
    • 哦,好的。我把那个拿回来。希望你觉得我的语气粗鲁,如果你这样做了,我深表歉意。
    • @HemalPandya:起初我做了一点,但我的脸皮很厚 :) 感谢您的回复。当我有时间时,我会添加更多。祝您有美好的一天。
    【解决方案3】:

    您在对评论的回答中提到“调用者不需要访问类的所有内部工作。”

    对我来说,这表明你想使用一个界面。

    创建一个描述将包含该秘密算法的类的接口:

    package com.stevej;
    
    public interface Longer {
    
      public int longer();
    
    }
    

    使用您的秘密算法实现该接口:

    package com.stevej;
    
    public class LongerImpl implements Longer {
    
      private int longer(int n){
        return 0; // whatever
      }
    
      @Override
      public int longer() {
        return longer(5); // whatever
      }
    
    }
    

    现在调用者只使用接口定义创建对象,保证没有他可以意外访问的暴露方法。该实现与该接口定义的对象挂钩:

    package com.stevej;
    
    public class LongerProcessor {
    
      Longer longerImpl = new LongerImpl();
    
      public LongerProcessor() {
        super();
      }
    
      public int longer() {
        return longerImpl.longer();
      }
    
    }
    

    现在您可以根据需要随时重写 Longer 的实现。只要接口定义永远不变,调用者(LongerProcessor)就永远不会有问题。哎呀,你可以有两个或多个不同的实现(LongerImplRecursive、LongerImplBruteForce 等),每个实现 Longer,并且都在同一个程序的不同位置使用:

    package com.stevej;
    
    public class LongerProcessor {
    
      Longer longerImpl;
    
      public LongerProcessor(boolean useRecursive) {
        super();
    
        if (useRecursive){
          longerImpl = new LongerImplRecursive();
        }else{
          longerImpl = new LongerImplBruteForce();
        }
      }
    
      public int longer() {
        return longerImpl.longer();
      }
    
    }
    

    这有多酷?由于您将此问题标记为“家庭作业”,我想知道这个问题是否应该让您考虑将合同(接口)与实现(实现类)分开。

    【讨论】:

      猜你喜欢
      • 2011-07-21
      • 2011-09-19
      • 2014-08-06
      • 2014-11-20
      • 2013-04-05
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      • 2011-12-06
      相关资源
      最近更新 更多