2012-04-19 8 views
2

EDIT:Инициализация объектов во время выполнения

Кажется, как будто я не был достаточно ясно, в чем я прошу, я буду пытаться объяснить лучше.

У меня есть класс с именем Board

Этот класс будет иметь 2-мерный массив, заполненный целыми числами, каждое целое значение в массиве соответствует некоторому классу (так 1 может быть короткой рукой для строки, например) ,

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

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

Я сделал небольшое изображение, чтобы попытаться представить себе, что я хочу: http://i.imgur.com/bZXrw.png

Наряду с некоторыми псевдо-кодом:

class Board: 
    Integer[][] some_array = {{1,2,1},{1,2,1}} 
    someStructure = {1 : createThing, 2 : createSomeOtherThing}; 

    generateObjects(): 
     List[Thing] container = [] 
     for y in some_array: 
      for x in y: 
       container.add(someStructure[x]()) 
     return container 

OLD рецептура:

У меня есть класс называемый Map, который должен содержать объект Integer[][], значения внутри объекта массива Integer соответствуют некоторому объекту, который будет n для инициализации.

Теперь, на языке, таком как Python, я мог бы, например, иметь словарь, который имеет целочисленные значения в качестве ключей и некоторые функции, которые создают и возвращают новые объекты при вызове, а затем перебирают через 2d-список и вызывают функции, возвращаемые dict. Как мне это сделать с Java?

Я, хотя о том, что имею HashMap и делаю какое-то отражение, но я действительно не знаю, что делать tbh.

+1

Это звучит как Guava 'Cache' ... –

+0

Итак, цель здесь - пройти через массив, и каждый раз, когда вы видите 1, вы вызываете function1(), 2: function2() и т. Д.? Если да, есть ли причина не использовать оператор switch? – Thomas

+0

Ну, коммутационный чехол был бы прекрасен, если бы у меня не было нескольких объектов, которые имеют разные требования и целочисленные значения. – Johan

ответ

3

Java не имеет замыканий или указателей на функции, но вы можете иметь ряд классов, реализующих интерфейс, и каждый класс будет иметь метод (скажем, метод «run» или «makeObject», что имеет смысл в вашем контексте). Эти методы создадут различные объекты, которые вам нужны. Вы можете сохранить эти классы в своем словаре.

Вот некоторые быстрый и грязный псевдокод, не тестируется:

/** 
* root for your object hierarchy 
*/ 
public class MyObject 
{ 
    // yadayada 
} 

/** 
* The interface 
*/ 
interface ObjCreator 
{ 
    public MyObject makeObject(); 
} 


/** 
* Classes to create specific objects 
*/ 
public class ObjMaker_1 
    implements ObjCreator 
{ 
    public MyObject makeObject() 
    { 
     return new Object1(); 
    } 
} 

... 

public class ObjMaker_n 
    implements ObjCreator 
{ 
    public MyObject makeObject() 
    { 
     return new Objectn(); 
    } 
} 



/** your dictionary */ 
Map<Integer, ObjCreator> dict = new HashMap<Integer, ObjCreator>(); 

dict.add(new Integer(1), new ObjMaker_1); 
dict.add(new Integer(2), new ObjMaker_2); 
... 
dict.add(new Integer(n), new ObjMaker_n); 

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

+0

Я не совсем уверен, как бы я это сделал, позаботьтесь, чтобы дать мне несколько ключевых слов для Googling/search вокруг StackOverflow? – Johan

+0

Я добавил несколько псевдокодов. Если функции создания короткие/простые, вы можете заполнить словарь с помощью анонимных классов вместо полностью определенных классов. – theglauber

Смежные вопросы