Передача типов примитивов как параметрический усилитель в Java

Я должен возвратиться/обновить булевскую переменную при возврате списка материала из метода. Java не может возвратить кортежи, и я не хотел делать отдельный класс для этого, так полагал, что я передам bool как параметрический усилитель. Это - то, что наш клиент C++ делает, bool передач ссылкой. Это работало бы на нормальный класс, так как вид Java имеет pass-ref для объектов (см., Java "передача ссылкой" или "передача значением"? для хорошего обсуждения этого). Но классы “Обертки” как булевская переменная хранят свое примитивное значение как неизменное, таким образом, это не может быть обновлено таким образом.

Используя булев массив (с одной записью) кажется неаппетитной едой, но, возможно, самая простая вещь, которая работает. С другой стороны, мог возвратить булевскую переменную и пасовать назад созданный список как параметрический усилитель, а не как возврат [но затем клиент Java отклоняется от C++, и лучше, если они сохраняют главным образом тот же подход - к вашему сведению нуждаются в этом в C# также.]

6
задан Community 23 May 2017 в 10:30
поделиться

4 ответа

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

Передача нового списка для получения результата списка и возвращение логического значения мне показалось бы наиболее естественным, но у вас есть веская причина; сохраняя интерфейс примерно одинаковым для нескольких реализаций.

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

public class Example {
    public class BooleanResult {
        private boolean result;

        public void setResult(boolean value) { result = value; }
        public boolean getResult() { return result; }
    }

    // ....
    public List doSomething(BooleanResult out) {
        List list;
        boolean result;

        // ...

        out.setResult(result);

        return list;
    }
}

и используя его как:

Example.BooleanResult out = new Example.BooleanResult();

List list = example.doSomething(out);

boolean result = out.getResult();
8
ответ дан 8 December 2019 в 03:52
поделиться

Нет, в Java нет передачи по ссылке для объектов; у него есть «передать ссылку по значению», что не одно и то же.

Вы определенно не можете передавать что-либо в качестве «выходного» параметра или по ссылке в Java - хотя вы могли бы передать это в C #.

Не могли бы вы инкапсулировать «логический плюс-список» в другой тип? Связаны ли они на самом деле? Использование логического массива определенно довольно некрасиво. Вы могли бы написать тип оболочки MutableBoolean - но опять же, это довольно некрасиво. Обычно я бы сказал, что возвращение двух вещей предполагает, что метод должен быть разделен, но когда один из них является логическим, это может быть довольно разумным - например, int.TryParse и т. Д. Из C #.

14
ответ дан 8 December 2019 в 03:52
поделиться

Я думаю, что один из интересных вопросов - каким должен быть ваш канонический внутренний формат для последовательностей? 2 очевидных выбора (по крайней мере) являются

a) utf8 в ванильных c-струнах b) utf16 в неподписанных коротких массивах

В предыдущих проектах я всегда выбирал utf-8. Почему; потому что это путь наименьшего сопротивления в мире С. Все, с чем вы взаимодействуете (stdio, string.h и т.д.), будет работать нормально.

Далее - какой формат файла. Проблема здесь в том, что он виден вашим пользователям (если только вы не предоставляете единственный редактор для вашего языка). Здесь я полагаю, вы должны взять то, что они дают вам и попытаться угадать, подглядывая (байтовые знаки порядка помогают)

-121--3632171-

Вы уверены, что это связано с числовыми проблемами? Я должен признать, что я точно не знаю, что вы пытаетесь вычислить, но когда вы имеете дело с углами на сфере, небольшие отклонения от того, что вы ожидаете в евклидовой геометрии.

-121--3113763-

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

Я столкнулся с той же проблемой, и лучшее решение IMHO обычно:

Просто забудьте о своих заботах, и сделайте отдельный класс.

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

Вероятно, после того, как ваша функция вернет экземпляр пользовательского класса, вы обнаружите, что есть дополнительные функциональные возможности, которые хорошо вписываются в этот класс, или другие методы, которые могут использовать класс в качестве параметра или возвращаемого значения, и скоро класс будет довольно полезным: -).

Если вы действительно не хотите делать это, вы всегда можете поместить все в java.util.List или java.util.Map и вернуть это. Но это действительно некрасиво: - (Я тоже это сделал, и пришел пожалеть об этом. Сначала это может показаться простым, но по мере развития и роста кода страдает читаемость (это был список целых чисел, затем двойной, или наоборот?). Занятия гораздо полезнее.

Примечание: Если вы считаете, что обычный класс высшего уровня переполнен, вы можете использовать вложенный класс , который хорошо подходит для классов только для «локального использования».

4
ответ дан 8 December 2019 в 03:52
поделиться

Чтобы вернуть несколько значений, я изменил тип возвращаемого значения, чтобы он возвращал массив объектов. [0] может быть логическим значением, а [1] может быть списком.

Обратной стороной является то, что вызывающий должен знать, как правильно привести возвращаемые объекты из массива объектов, а компилятор не может проверить это за вас.

Изменить: Здесь - это SO-ответ для возврата пары значений из Java.

1
ответ дан 8 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: