Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Правильное написание комплекса


Автор: barin_Student 1.2.2008, 07:43
Доброе время суток...
Что это за ошибка , я примерно догадываюсь...
Теперь вопрос, я в каждом новом классе объявляю одно и тоже например:
Код

public class Nuber1{
   ErrorLogger error = new ErrorLogger();
   Beeline beeline = new Beeline();
   GSMReader gsmReader = new GSMReader();
.......................................
}

Код

public class Nuber2{
   ErrorLogger error = new ErrorLogger();
   Beeline beeline = new Beeline();
   GSMReader gsmReader = new GSMReader();
.......................................
}

Код

public class NuberN{
   ErrorLogger error = new ErrorLogger();
   Beeline beeline = new Beeline();
   GSMReader gsmReader = new GSMReader();
.......................................
}

Я знаю(догадываюсь что это не правильно) ... как мне лучше сделать(может эти объявы сделать в одном какомнить классе) .. и все таки точно почему вышла эта ошибка?
Заранее благодарен.

Автор: jManiak 1.2.2008, 08:13
Цитата

public class StackOverflowError
extends VirtualMachineError

A StackOverflowError is thrown when the execution stack overflow occurs. This often occurs when a method enters infinit recursion.


Объекты держаться. Т.е. ссылки на них неудаляешь, и поэтому мусорщик не удаляет их. Вот оно и переволняется.

А на счет классов...
Написать один суперкласс, в нем реализовать общие для всех классов методы, объекты и т.п. А остальные классы уже наследовать от него.
Точно не помню, но по-моему такой Паттерн так и называется Superclass. Думаю всевидящий Гугл много скажет по этому поводу.

Автор: barin_Student 1.2.2008, 08:36
Имеется ввиду вот такая картина:


Код

public class Nuber1 extends SuperForNuber{
   private Booke()
  {
       super.error.Write("");
       super.beeline//
       super.gsmReader();
   }

.......................................
}
 

Код

 public class Nuber2 extends SuperForNuber{
   private Read()
  {
       super.error.Write("");
       super.beeline//
       super.gsmReader();
   }

.......................................
}
 


Код

public class NuberN extends SuperForNumber{
   private write()
  {
       super.error.Write("");
       super.beeline//
       super.gsmReader();
   }
.......................................
}
 
Код

public class SuperForNuber{
   ErrorLogger error = new ErrorLogger();
   Beeline beeline = new Beeline();
   GSMReader gsmReader = new GSMReader();

}

Автор: Kangaroo 1.2.2008, 11:14
Цитата(jManiak @  1.2.2008,  07:13 Найти цитируемый пост)
Объекты держаться. Т.е. ссылки на них неудаляешь, и поэтому мусорщик не удаляет их. Вот оно и переволняется.

А точно объекты? Это ж не OutOfMemory, а StackOverflowError. А обычно такое из-за рекурсивного метода.


barin_Student, а почему инициализацию тоже не вынести в супер класс? Или она разная?

Автор: barin_Student 1.2.2008, 11:44
Скажем так около 10% всех объектов можно инициализировать в Супере. Но вопрос если скажем класс делает сложение 2 чисел , вопщем вот такая картина:
Код

public class Summary exends Simulator{
   public void joker(){
       super.history.Write("Сложение двух чисел :2+2");
       int a = 2+2;
   }|
}

Код

а сaм Simulator:
public class Simulator{
     HistoryWriter history = new HistoryWriter();
..................
//и еще сотня объектов и методов...
}

Не получиться ли так что  extends Simulator ,  намного больше подгрузит в класс Summary чем я бы просто там это HistoryWruter объявил...
Собственно при написание комплекса как вы сами оьъекты храните и объявляете?

Автор: barin_Student 1.2.2008, 12:33
Вопщем тогда вопрос , как мне правильно поступить с объектами... или как мне их правильно объявить, чтоб мусорщих подчищал?........

Автор: jManiak 1.2.2008, 12:44
Цитата(Kangaroo @  1.2.2008,  11:14 Найти цитируемый пост)
А точно объекты? Это ж не OutOfMemory, а StackOverflowError. А обычно такое из-за рекурсивного метода.

Ну да, перепутал... smile хотя в цитате же правильно написано...

Автор: jManiak 1.2.2008, 20:35
Объявлять как и всегда. а чтобы не оставалось ссылок на них, достаточно обнулить.
объявление:
Код

myClass object1 = new myClass();

обнуление: 
Код

object1 = null;

Либо если объекты хранятся к примеру в массиве, либо какой-то коллекции, то соответственно искать их и обнулять ячейки массивалибо удалять из коллекции...

Автор: Ornitos 2.2.2008, 20:37
Цитата(barin_Student @  1.2.2008,  11:44 Найти цитируемый пост)
Не получиться ли так что  extends Simulator ,  намного больше подгрузит в класс Summary чем я бы просто там это HistoryWruter объявил...

Получится

http://en.wikipedia.org/wiki/Liskov_substitution_principle

Автор: barin_Student 4.2.2008, 11:32
Ведь суть дела поменяется если скажем так будет:
Код

public class test
{
      HistoryWriter history=null; 
      public int Number1()
      {
           history = new HistoryWriter();//получается данная ссылка подгружается только в момент работы метода, а после того как метод отработает , это ссылка - опять нулл будет?
      }
}

получается данная ссылка подгружается только в момент работы метода, а после того как метод отработает , это ссылка - опять нулл будет?
Я саму ошибку решил.. теперь просто знать надо как максимально верно писать надо)))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)