Статический метод Java - PullRequest
       1

Статический метод Java

2 голосов
/ 24 ноября 2011

Я новичок в Java, и я хотел знать, нормально ли возвращать объект из статического метода? Так как статические методы работают с классом ... Я немного запутался здесь. И что делать, если несколько потоков пытаются вызвать это?

class Test
{
    public static test(List<String> input) {
        List<List<String>> res = new ... ;
        // some code
        return res;
    }
}

Ответы [ 7 ]

4 голосов
/ 24 ноября 2011

Нет проблем с возвратом объекта из статического метода.

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

Статические методы НЕ работают с классом.Они просто связаны с классом, а не с членом этого класса.Это означает, что они не имеют доступа к каким-либо нестатическим членам класса.Кроме этого, они не очень отличаются от нестатических методов.

Если ваш статический метод получил доступ (запись или чтение) к статическому члену, то он может иметь проблемы с несколькими потоками, если вы не используете блокировку.

2 голосов
/ 24 ноября 2011

Согласен, метод отлично подойдет.

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

2 голосов
/ 24 ноября 2011

Здесь, при объявлении метода, вам нужно написать тип возвращаемого метода.

, например:

 import java.util.List;

    class Test
    {
        public static List test(List<String> input) {
            List<List<String>> res = new ... ;
            // some code
            return res;
        }
    }

Итак, этот метод вернет список, а для статического метода вам не нужносоздать объект этого класса

2 голосов
/ 24 ноября 2011

Статический метод связан с классом, если вы вызываете его из другого потока, для вашего продемонстрированного кода проблем не будет, поскольку res будет локальным потоком

1 голос
/ 24 ноября 2011

Чтобы получить общее представление о статических переменных / методах и переменных / методах экземпляра, прочитайте этот учебник или найдите похожие. Кроме того, этот вопрос и его ответы должны помочь объяснить, когда именно методы являются поточно-ориентированными (ваши данные не изменяют данные, которые могут быть разделены между потоками, поэтому он совершенно безопасен).

Что касается вашего кода, подпись вашего метода должна выглядеть примерно так:

public static List<List<String>> test(List<String> input) {...}

, так как вы будете возвращать список списков строк.

1 голос
/ 24 ноября 2011

Статический метод может получить доступ только к статическим объектам.

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

Так что вы можете легко это сделать.

1 голос
/ 24 ноября 2011

Это нормально, если вы работаете только с локальными переменными. Таким образом, ваш пример кода, где вы создаете новый List каждый раз, когда вы вызываете метод. Является ли это элегантным дизайном или нет, это отдельная история.

Если вы используете состояние, например, некоторые поля участника, это другая история. Несколько потоков могут вызывать ваш метод, и они работают с одними и теми же объектами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...