【问题标题】:can constructors actually return Strings?构造函数实际上可以返回字符串吗?
【发布时间】:2010-11-23 18:08:19
【问题描述】:

我在同名的 .java 文件中有一个名为 ArionFileExtractor 的类。

public class ArionFileExtractor {

public String ArionFileExtractor (String fName, String startText, String endText) {
    String afExtract = "";
    // Extract string from fName into afExtract in code I won't show here
    return afExtract;
}

但是,当我尝试在另一个 .java 文件中调用 ArionFileExtractor 时,如下所示:

String afe = ArionFileExtractor("gibberish.txt", "foo", "/foo");

NetBeans 通知我存在不兼容的类型并且需要 java.lang.String。但是我对 ArionFileExtractor 进行了编码以返回标准字符串类型,即 java.lang.string。

我想知道,我的 ArionFileExtractor 构造函数可以合法地返回一个字符串吗?

我非常感谢任何提示或指示我在这里做错了什么。

【问题讨论】:

  • 我认为您应该多阅读一些关于面向对象编程的内容。似乎您不了解这个概念,因为您为简单的 String 任务编写了一个类。
  • 感谢您的建议。我会回到书本上。
  • @stefita,在 Java 中,因为一切都是一个类,如果你只需要一个静态方法,你仍然必须将它包装在一个类周围,即使它不是真正的对象OO 感。
  • 只是一个有趣的花絮:如果你想变得棘手,实际上可以使用__new__ 方法在 Python 中做这种事情。 (这是一个容易被滥用的能力)
  • @David:关于试图执行公认荒谬任务的无关语言的评论? +1

标签: java string constructor return


【解决方案1】:

没有。 构造函数并没有真正返回任何东西。相反,它会构建有问题的对象。

看起来你想要一个实用方法:

public class Whatever {
   public static String doStuff(String s) {
      return s;
   }
}

【讨论】:

    【解决方案2】:

    构造函数创建对象,它们不返回数据。

    【讨论】:

    • 构造函数是一种没有指定返回类型(甚至不是 void)并且具有与类名相同的标识符的方法。如果您要返回任何东西,那么您就不是在编写构造函数。使用new 关键字调用构造函数,因此如果您尝试使用现有构造函数而不使用new,那么您做错了。 HTH。
    • 这是一个很好的观点,你不能说它实际上返回了一个创建的新对象的实例。简单的答案,有利于您的声誉:-)
    • 如果你想学究气,构造函数不会返回任何东西,但它会在分配给变量时评估为引用。 :P
    • 我认为答案应该很简单。与其说是执行,不如说是概念。
    • 我同意铺路。简单就好。 elwynn 需要一个快速简单的“这就是为什么”,而不是深入的学术讨论。
    【解决方案3】:

    构造函数不是常规方法。它总是返回它所属的类的实例。在您的示例 ArionFileExtractor 中。无法返回任何其他实例。

    请注意,您不能显式指定构造函数的返回类型,也不能使用 return 关键字(在这种情况下是非法的)。

    【讨论】:

    • 构造函数不返回任何东西,它是返回实例的新表达式(类实例创建表达式)。 ((同样在字节码中,构造函数返回 void))
    【解决方案4】:

    构造函数只能返回其类的实例。它不能返回字符串。 例如,如果您有 SampleClass 类,则构造函数只能返回 SampleClass 类的对象。

    【讨论】:

    • 构造函数不返回任何内容。它初始化数据。
    【解决方案5】:

    构造函数只能返回它构造的对象的一个​​实例——否则你没有引用可以挂在你刚刚创建的对象上!如果要进行“实用程序”调用,请考虑使用静态方法:

    public class ArionFileExtractor {
        public static String getFileContents(String fName, String startText, String endText) {
            String afExtract = "";
            // Extract string from fName into afExtract in code I won't show here
            return afExtract;
        }
    }
    

    可以使用

    ArionFileExtractor.getFileContents(...)
    

    【讨论】:

    • 将 :: 替换为 .一切就绪,因为它是 Java。 :)
    • 实际上是 Java 中的 ArionFileExtractor.getFileContents(...)(它不使用 :: 表示任何东西)。但无论如何 +1。
    • @crunchdog,@David GAH!感谢您的光临,在下午剩下的时间里,我已经把我的 C++ 头拿走了。
    【解决方案6】:

    您的方法ArionFileExtractor() 不是构造函数。构造函数没有返回类型,如下所示:

    public  ArionFileExtractor (String fName, String startText, String endText) {
        //...
    }
    

    注意缺少返回类型。

    【讨论】:

      【解决方案7】:

      不,它不应该能够合法地返回一个字符串。我不确定为什么 Netbeans 在您尝试时不会简单地向您吐口水。也许它试图将其编译为某种静态方法。构造函数通常在代码中没有返回类型,因为当它们被编译时,它们被分配为返回它们正在构造的类的实例。

      调整代码最简单(尽管不一定是最好)的方法是使用一个空构造函数并将当前构造函数转换为静态方法,如下所示:

      public class ArionFileExtractor {
      
      private ArionFileExtractor() {}
      
      public static String ExtractFile(String fName, String startText, String endText) {
          String afExtract = "";
          // Extract string from fName into afExtract in code I won't show here
          return afExtract;
      }
      }
      

      私有构造函数使得 ArionFileExtractor 只能静态使用,不能被实例化。然后,当您使用它时,您只需执行以下操作:

      String afe = ArionFileExtractor.ExtractFile("gibberish.txt", "foo", "/foo");
      

      请注意,使用静态类有时被认为是不好的形式 - 视情况而定。所以可能值得尝试想出一种不同的方法来做到这一点。

      【讨论】:

        【解决方案8】:

        Java 编译器将 ArionFileExtractor 视为实例方法,

        String afe = new ArionFileExtractor().ArionFileExtractor("gibberish.txt", "foo", "/foo");
        

        【讨论】:

          【解决方案9】:

          尽管令人惊讶的是,您编写的代码有一个默认的无参数构造函数。 ArionFileExtractor 是一种返回字符串的方法。当我第一次看到这样做的代码时,我感到非常惊讶,因为这肯定是一个意外(就像你的情况一样)。

          你可以用以下方式调用你的方法(只是为了说明情况):

          String afe = new ArionFileExtractor().ArionFileExtractor("gibberish.txt", "foo", "/foo");
          

          听起来你真正想要的是一个静态方法,而不是一个类。

          public class ArionFileExtractor() {
                 public static String extract(String fName, String startText, String endText) {
                       String afExtract = "";
                         // Extract string from fName into afExtract in code I won't show here
                      return afExtract;
                 }
          }
          

          你会打电话给:

          String afe = ArionFileExtractor.extract("gibberish.txt", "foo", "/foo");
          

          【讨论】:

            【解决方案10】:

            是的。只有 String 类构造函数可以从中返回字符串对象;)。

            这基本上意味着构造函数创建了你正在调用的类的对象。

            【讨论】:

              【解决方案11】:

              您需要首先创建对象(使用构造函数),然后对其进行处理。

              Java 很少有智能快捷方式。我

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-02-03
                • 1970-01-01
                • 2011-02-07
                相关资源
                最近更新 更多