2012-03-24 3 views
0

Так что эти 2 файла, которые я собираюсь публиковать, каждый в моем пакете DataBase. Класс DBBinding просто должен создать объект со строкой для ключа и один для значения. Затем DBrecord собирается хранить коллекцию DBBindings, которые имеют одну и ту же ключевую строку, но разные строки значений. По какой-то причине я не могу представить/найти правильный способ сделать метод добавления в DBrecord, чтобы он вызывал конструктор DBBinding/объекты.Невозможно получить конструктор из другого класса в том же пакете, который должен быть распознан.

Это метод, который должен добавить связывание:

private void addRecord(String key_, String value_) 
{ 
    //DBBinding myDBBinding=new DBBinding(key_, value_);//constructor not defined error 
    //DBBinding myDBBinding(key_,value_); 
    //DataBase.DBBinding myDBBinding=new DataBase.DBBinding(key_, value_);//constructor not defined error 

} 

Вот код DBBinding с последующим кодом DBrecord.

package DataBase; 

public class DBBinding { 

    private String key; 
    private String value; 

    public void DBBinding(String key_, String value_) 
    { 
     String key =new String(key_); 
     String value=new String(value_); 
    } 

    //public String toString() 
    //{return key+": "+value;} 

} 

и

package DataBase; 
//package DataBase.*; 
import DataBase.*;//did not help ... ? 

public class DBrecord { 

    boolean select; 
    String key; 
    //need some type of collection to keep bindings. 

    public void DBrecord() 
    { 
     DBrecord myRecord=new DBrecord(); 
     select=false; 
    } 

    private void addRecord(String key_, String value_) 
    { 
     //DBBinding myDBBinding=new DBBinding(key_, value_);//constructor not defined error 
     //DBBinding myDBBinding(key_,value_); 
     //DataBase.DBBinding myDBBinding=new DataBase.DBBinding(key_, value_);//constructor not defined error 

    } 

    public String toString() 
    { 
     //out put key first then all values in collection/group/record. use correct formatting. 
    } 



} 
+1

Я понимаю, что это просто домашнее задание, но лучше всего было бы предоставить экземпляр DBBinding для класса DBRecord через параметр конструктора или с помощью метода setter. Используемый в сочетании с интерфейсами, вы уменьшите связь между вашими классами, что упростит их тестирование и поддержку. Если вам нужна возможность создавать эфемерные объекты в ваших методах, вы обычно предоставляете фабричный класс, который может использоваться с помощью тех же механизмов. – tvanfosson

+0

Tvanfosson.Не совсем уверен, что вы подразумеваете под «предоставлением экземпляра DBBinding для класса DBRecord через конструктор», можете ли вы более подробно рассказать об этом и/или указать мне на некоторые ресурсы, которые обсуждают это. –

+0

Эта концепция называется инъекцией зависимостей, http://en.wikipedia.org/wiki/Dependency_injection – tvanfosson

ответ

4

В классе DBBinding вы должны иметь public DBBinding(String key_, String value_), то void делает "конструктор" на самом деле метод :-)

Вы имеете ту же ошибку в DBrecord.

Кстати, не делать этого:

String key =new String(key_); 

Строки неизменны, ничего не может произойти, если вы «доля» их. Но ваш код заставляет Java создавать новый объект для абсолютно идентичного значения. Поэтому используйте только

String key = key_; 

Однако в вашем случае даже это не так, как вы создаете новую локальную переменную key «теневое» класс переменной key. Посмотрите here для объяснения.

Так ALLtogether DBBinding должен выглядеть следующим образом:

package DataBase; 

public class DBBinding { 

    private String key; 
    private String value; 

    public DBBinding(String key_, String value_) 
    { 
     key = key_; 
     value = value_; 
    } 
    ... 
} 
2

Если вы хотите, чтобы ваш код работать, пожалуйста, удалите void конструкцию из ваших конструкторов.

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

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

+0

Я согласен с основным направлением вашего ответа, но технически это неправильно. aaron burns не имеет никаких пустот в конструкторах, потому что явно не определены конструкторы. Есть несколько неправильно названных методов, которые выглядят как конструкторы. – emory

+0

Богдан прав, у меня есть пустоты на моих конструкторах. Эмори может быть правильно подумано, что мои конструкторы плохо написаны. Что бы вы сделали по-разному о конструкторах emory. –

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