Лучший способ действительно зависит от функции и аргументов. Каждая из Ваших опций является хорошей идеей в различных ситуациях. Я обычно пробую их в следующем порядке до одного из них работы:
Используя дополнительные аргументы как y = y || 'значение по умолчанию'. Это удобно, если бы можно сделать это, но это не может всегда работать практически, например, когда 0/null/undefined был бы допустимым аргументом.
Используя количество аргументов. Подобный последней опции, но может работать, когда № 1 не работает.
типы Проверки аргументов. Это может работать в некоторых случаях, где количество аргументов является тем же. Если Вы не можете надежно определить типы, Вы, возможно, должны использовать различные имена.
Используя различные имена во-первых. Вы, возможно, должны сделать это, если другие опции не будут работать, не практичны, или для непротиворечивости с другими связанными функциями.
Любая реализация java.util.Map
сделает это - нет ограничений на то, сколько раз конкретное значение могут быть добавлены в виде отдельных ключей:
Map<String,Integer> m = new HashMap<String, Integer>();
m.put("Hello", 5);
m.put("World", 5);
System.out.println(m); // { Hello->5, World->5 }
Если вам нужна карта, где один ключ связан с несколькими значениями, это называется мульти-карта , и вы можете получить ее из google java API коллекций или из общих-коллекций Apache
Гм…
Map map = new HashMap();
Object someValue = new Object();
map.put(new Object(), someValue);
map.put(new Object(), someValue);
Теперь карта содержит одно и то же значение дважды, доступное через разные ключи. Если это не то, что вы ищете, вам следует переработать свой вопрос. :)
this может делайте то, что хотите:
import java.util.*;
class Value {
public String toString() {
return x.toString();
}
Integer x=0;
}
public class Main {
public static void main(String[] arguments) {
Map m=new HashMap();
final Value v=new Value();
m.put(1,v);
m.put(2,v);
System.out.println(m.get(1));
System.out.println(m.get(2));
v.x=42;
System.out.println(m.get(1));
System.out.println(m.get(2));
}
Я как бы иначе интерпретировал его просьбу. Что, если кто-то хочет, чтобы два совершенно разных набора ключей имели доступ к одним и тем же базовым значениям. Например:
"Hello" ------|
|----> firstObject
3 ------|
"Monkey" ------|
|----> secondObject
72 ------|
14 -----------> thirdObject
"Baseball" ------|
|----> fourthObject
18 ------|
Очевидно, что наличие двух карт, одна для целочисленных ключей и одна для ключей String, не сработает, поскольку обновление одной карты не отразится на другой карте. Предположим, вы изменили Map
, обновив «Monkey» для сопоставления с FridayObject. Результатом этой модификации является изменение Entry
на этой карте, но это, конечно, не влияет на другую карту. Итак, в то время как то, что вы намеревались сделать, было:
"Monkey" ------|
|----> fifthObject
72 ------|
в действительности вы бы получили следующее:
"Monkey" -----------> fifthObject
72 -----------> secondObject
то, что я делаю в этой ситуации, - это две расположенные рядом карты, но вместо того, чтобы заставлять их говорить Карта
Я бы сделал их Map
, где связанный массив представляет собой массив с одним элементом. В первый раз, когда я связываю ключ со значением, если массив еще не существует и ключ возвращает null, я создаю массив и связываю с ним любой другой ключ, который хочу (на карте этого ключа). Впоследствии я изменяю только содержимое массива, но не ссылку на сам массив, и это прекрасно работает.
"Monkey" -------> fifthObjectArray ------|
|-----> fifthObjectArray[0]
72 -------> fifthObjectArray ------|