могут ли конструкторы возвращать строки? - PullRequest
4 голосов
/ 28 августа 2009

У меня есть класс с именем ArionFileExtractor в файле .java с тем же именем.

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;
}

Однако, когда я пытаюсь вызвать ArionFileExtractor в другом файле .java, как показано ниже:

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

NetBeans сообщает мне, что существуют несовместимые типы и что требуется java.lang.String. Но я кодировал ArionFileExtractor для возврата стандартного строкового типа, который является java.lang.string.

Мне интересно, может ли мой конструктор ArionFileExtractor легально вернуть строку?

Я очень ценю любые советы или указатели о том, что я делаю здесь неправильно.

Ответы [ 11 ]

15 голосов
/ 28 августа 2009

Конструкторы создают объекты, они не возвращают данные.

9 голосов
/ 28 августа 2009

Ваш метод, ArionFileExtractor(), не является конструктором. Consutructors не имеют типов возврата и выглядят так:

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

Обратите внимание на отсутствие типа возврата.

5 голосов
/ 28 августа 2009

Конструктор может возвращать только экземпляр созданного им объекта - в противном случае у вас нет ссылки на объект, который вы только что создали! Если вы хотите сделать «служебный» вызов, рассмотрите статический метод:

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(...)
4 голосов
/ 28 августа 2009

Как это ни удивительно, код, который вы сделали, имеет конструктор по умолчанию без аргументов. 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");
2 голосов
/ 28 августа 2009

Компилятор Java рассматривает ArionFileExtractor как метод экземпляра,

String afe = new ArionFileExtractor().ArionFileExtractor("gibberish.txt", "foo", "/foo");
2 голосов
/ 28 августа 2009

Конструктор не является обычным методом. Он всегда возвращает экземпляр класса, к которому он принадлежит. В вашем примере ArionFileExtractor. Невозможно вернуть любой другой экземпляр.

Обратите внимание, что вы не можете явно указать тип возвращаемого значения для конструктора или использовать ключевое слово return (недопустимо в этом контексте).

1 голос
/ 28 августа 2009

Нет, он не должен иметь возможность законно вернуть строку. Я не уверен, почему 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");

Имейте в виду, что использование статических классов иногда считается дурным тоном - в зависимости от ситуации. Так что, возможно, стоит попытаться придумать другой способ сделать это.

1 голос
/ 28 августа 2009

Конструктор может возвращать только экземпляр своего класса. Он не может вернуть строку. Например, если у вас есть класс SampleClass, конструктор может вернуть только объект класса SampleClass.

0 голосов
/ 28 августа 2009

Вам необходимо ПЕРВЫМ создать объект (используя конструктор), а ТО делать с ним вещи.

У Java очень мало умных ярлыков. I

0 голосов
/ 28 августа 2009

Да. Конструктор класса String может возвращать из него строковые объекты;).

Это в основном означает, что конструктор создает объект класса, который вы вызываете.

...