Это объявление класса Java правильно? - PullRequest
0 голосов
/ 15 мая 2011

Я хочу построить Data основной класс с подклассами DataClass1 (с собственным подклассом Item) и DataClass2 (с собственным подклассом Item1).

public class Data{

        public  List<DataClass1> dataClass1List = new ArrayList<DataClass1>();
        public  List<DataClass2> dataClass2List = new ArrayList<DataClass2>();


        public class DataClass1{

            public String name;   
            public  List<Item> itemList = new ArrayList<Item>();

            public class Item{
                public String n1;          
                public String n2;               
                public String n3;              
            }

        }


        public class DataClass2{

            public String name; 
            public  List<Item1> item1List = new ArrayList<Item1>();

            public class Item1{
                public String n5;
                public String n6;   
            }

        }

    }

Когда я хочу заполнить основной класс Data, я использую этот код:

Data data = new Data();
Item itm = new Item;
itm.n1="1";
itm.n2="2";
itm.n3="3";
data.dataClass1List.itemList.add(itm);

и тоже самое для dataClass2List

Все подклассы должны быть открытыми1015 *

Есть ли лучший способ объявить и заполнить мой класс Data

Спасибо !!!

ps Класс данных и его подклассы содержат только переменные, а не методы!

Ответы [ 2 ]

2 голосов
/ 15 мая 2011

Вы, кажется, путаете некоторые понятия здесь.

В вашем коде нет подклассов.DataClass1 и DataClass2 являются внутренними классами из Data, Item является внутренним классом DataClass1, а Item1 является внутренним классом DataClass2.

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

С этими внутренними классамипредлагаемое ими использование не будет работать, так как они являются нестатическими внутренними классами, и могут быть созданы только в контексте экземпляра внешнего класса.

С помощьюОпределения классов, как они есть, перевод вашего опубликованного использования будет примерно

Data data = new Data();
DataClass1 dc1 = data.new DataClass1();
Item itm = dc1.new Item();
itm.n1="1";
itm.n2="2";
itm.n3="3";
dc1.itemList.add(itm);
data.dataClass1List.add(dc1);

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

Как отметил WirthLuce в комментарии, вы должны изменить имена, чтобы представлять что-то в вашем домене.и создайте методы, чтобы заставить их делать что-то уместное, а не просто хранить данные, которыми манипулируют извне.

1 голос
/ 15 мая 2011

Некоторые предложения:

  • Вы должны использовать getter и setter для доступа к различным полям.
public class SomeClass {

    private String name;
    [...]

    public void setName(String name) {this.name = name;}
    public String getName() {return name;}
    [...]
}
  • Поскольку классы данных являются общедоступными, нужно ли им быть внутренним классом?

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

  • Все внутренние списки могут быть сделаны `final`.
public final List<Item> itemList = new ArrayList<Item>();
  • Вы можете создать конструктор для класса Item.
public class Item {
    public Item(String n1,String n2,String n3)  {
        this.n1 = n1;
        this.n2 = n2;
        this.n3 = n3;
    }
    [...]
}
...