LINUX.ORG.RU

Передача параметров в метод

 


0

1

Как по простому передать в функцию объет(ассоциативный массив параметров)
В JS делается так

func({
   bla: 1,
   foo: 2
})

В ПХП делается так
func([
   "bla" => 1,
   "foo"=> 2
])

В Java нужно создавать сначала массив или map, потом присваивать значения, это очень неудобно
Map<String, String> p = new HashMap<>();
p.put("bla", "1");
p.put("foo", "2");
func(p)

Можно ли как-нибудь упростить код?

★★★★

Нет, нельзя. В лучшем случае будет вот так:

import java.util.*;

public class HelloWorld
{
  public static void main(String[] args)
  {
    testMap(new HashMap<String, String>(){{put("hello", "world");put("a", "b");}});
  }
  private static void testMap(Map<String, String> map) {
    System.out.println("The value is " + map.get("hello"));
  }
}

В хитрой строчке появляется класс-наследник от HashMap (первая пара фигурных скобок), у которого в инициализаторе вызываются методы put (вторая пара скобок).

Но без нужды лучше так не делать.

anonymous
()

Это читабельнее гораздо, чем инициировать свой массив в списке параметров метода, что вообще за наркоманы это придумали? Если значений в нем несколько, то можно передать их без массива, если много то в списке параметров будет нечитабельный ад.

ertgblasd ★★
()
Последнее исправление: ertgblasd (всего исправлений: 1)
Ответ на: комментарий от ertgblasd

Ну понятно что там не будет 1 000 000 параметров. В среднем 3-10, в JS это обычная практика передачи параметров или инициализации. Одним вывозом настраиваешь весь объект сразу, а ты тыкаешь потом
obj.setParam(«a», 2);
obj.setParam(«b», 4);
obj.setParam(«c», 5);
и т.д.

gobot ★★★★
() автор топика

Создай класс с нужными полями, если уж прям так надо, и успокойся. Не надо городить говнокод.

nexfwall ★★★★
()

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

umren ★★★★★
()
Ответ на: комментарий от nexfwall

Поля могут быть какими угодно, что мне 100 классов создавать? По сути это прокладка, параметры будут передаваться в POST запрос

gobot ★★★★
() автор топика

В Java же вроде есть возможость передавать неопределенное количество аргументов в метод? Так же как в PHP "..." используется, если мне память не изменяет.

Или именно HashMap нужен?

shooter93 ★★
()
Ответ на: комментарий от shooter93

Ну так можно и массив замутить, тоже самое будет, но только мне нужно ассоциативный, который потом пойдет в http post или get запрос(var=val&foo=bar). Я как понял в java нет простой конструкции создания хэша и присвоения значений на лету типа {x: 1, y:2}.

gobot ★★★★
() автор топика

В 9-ке можно будет делать так:

func(Map.of("bla", "1", "foo", "2"))

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

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 1)
Ответ на: комментарий от anonymous

Не делай так:

{{put("hello", "world");put("a", "b");}}

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

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 1)
Ответ на: комментарий от gobot

Создать один класс со всеми возможными полями. «null» воспринимать не иначе как его отсутствие. И конструкторов понасоздавать, разного рода (главное не переборщить).

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

nexfwall ★★★★
()
Последнее исправление: nexfwall (всего исправлений: 1)
Ответ на: комментарий от foror

если это анонимные классы, зачем что-то хранить после их использования, если на них ссылок больше нет? Разве в JAVA нет GC?

xlsparse
()
Ответ на: комментарий от ertgblasd

если много то в списке параметров будет нечитабельный ад

да? А вас не смущает, что параметры в функцию передаются as is? Почему бы не писать тогда вместо fu(a, b, c)

params = [0: a, 1: b, 2: c]
fu(params)
так читабельней?

xlsparse
()
Ответ на: комментарий от xlsparse

Если в передается один небольшой массив, то это еще ничего, а если он большой + другие параметры метода, то будет каша. Не знаю как там делается в джаваскрипте, но в java инициировать массив в списке аргументов метода это очень-очень странно. И да, вариант с params = гораздо яснее.

ertgblasd ★★
()
Ответ на: комментарий от foror

как они это будут делать ведь там с тип ключа и значения разный может быть? или там тупо return (Ma<K, V>) map; ?

Deleted
()
Ответ на: комментарий от Deleted

Они делают это вот так:

    static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,
                               K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10) {
        return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,
                                               k6, v6, k7, v7, k8, v8, k9, v9, k10, v10);
    }

        MapN(Object... input) {
            Objects.requireNonNull(input);
            if ((input.length & 1) != 0) {
                throw new InternalError("length is odd");
            }
            size = input.length >> 1;

            int len = (int)Math.ceil(EXPAND_FACTOR * input.length);
            len = (len + 1) & ~1; // ensure table is even length
            table = new Object[len];

            for (int i = 0; i < input.length; i += 2) {
                @SuppressWarnings("unchecked")
                    K k = Objects.requireNonNull((K)input[i]);
                @SuppressWarnings("unchecked")
                    V v = Objects.requireNonNull((V)input[i+1]);
                int idx = probe(k);
                if (idx >= 0) {
                    throw new IllegalArgumentException("duplicate key: " + k);
                } else {
                    int dest = -(idx + 1);
                    table[dest] = k;
                    table[dest+1] = v;
                }
            }
        }
foror ★★★★★
()
Ответ на: комментарий от xlsparse

Эти анонимные классы компилятся в *$*.class файлы и потом размещаются в metaspace при старте проекта и занимают свою память.

foror ★★★★★
()
Ответ на: комментарий от Deleted

Ну так тоже можно делать ) Было бы желание, а синтаксический сахар всегда можно напридумывать не наворачивая ЯП новыми токенами.

foror ★★★★★
()
Ответ на: комментарий от foror

а синтаксический сахар всегда можно напридумывать не наворачивая ЯП новыми токенами

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

A1
()
Ответ на: комментарий от gobot
import java.util.Map;
import java.util.HashMap;

class MapBuilder<K, V> {
    private Map<K, V> map = new HashMap<>();

    public MapBuilder<K, V> put(K key, V value) {
        map.put(key, value);
        return this;
    }

    public Map<K, V> build() {
        return map;
    }

    public static void main(String[] args) {
        Map<String, String> m = new MapBuilder<String, String>()
            .put("foo", "bar")
            .put("bar", "foo")
            .build();
        System.out.println(m);
    }
}
anonymous
()

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

CatsCantFly
()
Ответ на: комментарий от anonymous

Понятно...но это никак не упрощает, все та же цепочка из new...put, put, put. А если понадобится передать не только строку, то код усложнится еще

Я уже понял что в яве нет простой конструкции как в жс или пхп

gobot ★★★★
() автор топика
Последнее исправление: gobot (всего исправлений: 1)
Ответ на: комментарий от gobot

То, что ты хочешь, называется Map Literal и его в Java действительно нет. Даже для списка нет (для массива есть, но оно очень неудобно).

Но так код обычно не пишут. Типизацию в Java придумали не для красного словца.

Legioner ★★★★★
()

а в чем проблема?

service locator, DI может подойти

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.