2016-07-31 4 views
0

Я довольно новичок в прообразовании Java, как я уже говорил в названии. Я хочу передать некоторые параметры, которые могли бы или не могли существовать как экземпляры класса. Если он не существует, я хочу его создать. Мой код до сих пор:Передача параметра, который не существует для метода

public class TestClass { 

public static void main(String[] args) { 
    Person Ted = new Person(); 
    Person Jack = new Person(); 
    Item it = new Item(Ted); 
    Item itSec = new Item (Pierce); //Person Pierce doesn't exist => should be created 
} 
} 

public class Person { 
public Person(){ 
    //some code 
} 
} 

public class Item { 

public Item(Person name){ 
    if(!(name instanceof Person)){ 
     Person name = new Person(); //create that missing instance 
    } 
    else{ 
     //some code 
    } 

void getItem(Person name){ 
    System.out.println(name); 
} 
} 
+0

В этом случае вы можете использовать конструктор '0-arg'. –

+1

Это не имеет смысла. Если 'Pierce' даже не объявлен *, тогда код не будет компилироваться. Вы можете передать объявленную переменную, которая не инициализирована (это 'null'), но вы не можете передать переменную, которая * не существует *. – David

+0

Я хочу найти способ передать параметр; если он не существует, он должен быть создан. Есть идеи? –

ответ

0

Что вы ожидаете без instancing?

Person Pierce = new Person(); 
Item itSec = new Item (Pierce); 
+0

Ну, именно я хочу, чтобы этот экземпляр был самосоздан, если он не существует. Я мог бы создать конструктор Item (String name), но в этой ситуации я не знаю, как создать экземпляр Person name = new Person(); –

+0

Вы можете, но что вы ожидаете, используя ссылку в методе? Вы должны добавить новый конструктор с параметром String в класс Person. Для каждого человека вы думаете создать новую ссылку? Это бесполезно @jedi_mind_java – snr

0
Item itSec = new Item (Pierce); //Person Pierce doesn't exist => should be created 

Если он не существует, я хочу, чтобы создать его.

Об этом нет «если». Код никогда не объявлял эту переменную, поэтому будет никогда. (И никогда не компилировать в его текущем состоянии Конечно ваш Java компилятор говорит вам об этом.). Учитывая, что он всегда должен быть создан, создайте его:

Person Pierce = new Person(); 
Item itSec = new Item(Pierce); 

Edit: основе текущие комментарии, это звучит как вы хотите иметь что-то более похожее на Map. Рассмотрим пример:

Map<String,Person> people = new HashMap<String,Person>(); 
people.put("Pierce", new Person()); 

Map бы быть в основном коллекция пар ключ/значение, где имя является ключевым и Person это значение. Вы можете динамически добавлять/редактировать/удалять элементы в коллекции по своему усмотрению.

Затем, чтобы использовать его, вы бы назвали еще одну операцию на карте:

Item itSec = new Item(people.get("Pierce")); 

Вы можете использовать различные операции, чтобы проверить, если значение существует в коллекции, добавить его, и т.д. Вы даже можете продлить класс, чтобы добавить свои собственные операции, которые создают один, если он не существует при попытке его получить.

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

0

Вы не можете использовать переменную, которая не существует ...

Item itSec = new Item (Pierce); 

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

Код:

if(!(name instanceof Person)){ 
    Person name = new Person(); //create that missing instance 
} 

ли на самом деле не имеет никакого смысла, потому что это то же самое, как вызов

Person Ted = new Person(); 
Person Jack = new Person(); 

в котором экземпляр Person фактически не содержит каких-либо данных (если у вас есть некоторые магия происходит при создании экземпляра Person!)

Я предполагаю, что вы действительно хотите передать не объект, переменная которого является именем человека, а объект Person, который содержит имя человека.

Если да, то ваш код должен быть таким:

Person p1 = new Person("Ted"); 
Person p2 = new Person("Jack"); 

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

Item(String personName) { 
    if(isExisting(personName)) { 
    getPerson(personName); 
    } else { 
    Person p = new Person(personName); 
} 

boolean isExisting(String personName) { 
    // Check if person exists somewhere 
} 

Person getPerson(String personName) { 
    // Retrieve the Person instance with the same person name. 
} 
0
 if(!(name instanceof Person)){ 
     Person name = new Person(); 
    } 

это означает меньше, потому что «имя» всегда объект является экземпляром человека в этой ситуации .. Пункт itSec = новый Предмет (Pierce); Пирс - это не объект. Мы можем передать объект Person только для конструктора класса Item. Нет никакого способа создать объект любого класса, просто передав переменную unkown.

1

Вы неправильно понимаете некоторые вещи.

Вы не можете использовать идентификатор до его объявления. Ниже не правильно в вашем коде:

Item itSec = new Item (Pierce);

Это потому, что ты не объявлял Pierce до этой линии. Вам не нужно создавать экземпляр класса, но вам нужен действительный идентификатор. Вы должны объявили его перед таким образом:

Person Pierce;

На данный момент идентификатор или ссылку, пустой, так сказать, или она равна null. Все ссылки на объекты, которые не являются локальными, инициируются таким образом или равны false или 0, в зависимости от того, что подходит для их типа. Результат такой же, как если бы вы объявили в явном виде:

Person Pierce = null;

Но давайте двигаться дальше. Скажем, ссылка была объявлена. (Btw, Java использует camelCaseNotation для переменных, поэтому pierce будет верным.) Предположим, что мы находимся в точке, когда Pierce имеет значение null или относится к некоторому объекту, мы не знаем. Теперь мы называем это:

Item itSec = new Item (Pierce);

new Item(Pierce) вызывает конструктор public Item(Person name){...} в классе Item, который вы должны знать. Но теперь, в этом конструкторе есть строка:

if(!(name instanceof Person)){

которого неправильно. То, что эта строка проверяет, не является, если переменная name равна нулю или существующему объекту, но Тип переменной name является подтипом Person. Который всегда будет возвращать true в этом месте, поскольку заголовок функции public Item(Person name){...} говорит следующее: функция является открытой, является конструктором, а аргумент имеет тип Person (так Person или подтип).

Что вы хотите сказать, вот это:

public Item(Person name){ 
    if(name==null)){ //if the reference is empty 
     this.name = new Person(); //I'll explain this below 
    } 
    else{ 
     this.name = name; //otherwise the local "name" will stay null 
    } 
} 

Я использовал this.name и это был скачок вперед. Зачем? В вашем коде Person name = ..., что является неправильным, так как name не продлится после завершения конструктора. Вам нужно поле в объекте класса Item, которое будет удерживать это значение. Так Item класс может быть определен следующим образом:

public class Item { 
Person name; 
//... 
} 

А теперь поле name держит значение, присвоенное в строке:

this.name = new Person();

Вы должны использовать this к неоднозначности, какие name вам средства , Один из них - поле класса Item, другое - Person name параметр конструктора.

Теперь мы возвращаемся к функции main. Если вы хотите, чтобы переменная Pierce ссылалась на вновь созданный Person, это еще нужно сделать. Назначение может иметь место здесь, но сначала вам нужно создать функцию в классе Item, которая возвращает значение своего поля name. Итак:

getName() { 
    return name; 
} 

И теперь называем его из функции main:

Pierce = itSec.getName();

Вот и все. Наконец, эта функция не имеет смысла:

void getItem(Person name){ 
     System.out.println(name); 
    } 
} 

Это не получить любого предмета. Он печатает только то, что вы передаете ему. И это не значит, что если вы назовете его getItem(Pierce), вы увидите «Пирс» на экране. Он будет вызывать функцию toString в объекте, обозначенном Pierce, и, как есть, вы получите стандартный идентификатор объекта. Но если вы определите какую-либо функцию:

void printItem() { 
    System.out.println(name); 
} 

Тогда вы можете назвать это так. Для существующего объекта itSec:

itSec.printItem();

Что касается функции геттера, она должна вернуть то, что вы просите, но это другая история.

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