Java создан ли объект

Проверка стартовых данных при создании объекта

Доброго времени суток, как проверить входящие данные при создании объекта, например у меня есть объект Rectangle, в нём параметры конструктора координаты вершин, и при создании объекта не должны быть на одной прямой, как правильно сделать? Проверять данные до начала объекта, больше всего логичнее, но а может как-то можно при создании объекта проверить?

public class Main < public static void main(String[] args) < // проверка? Rectangle rect = new Rectangle(1,2, 3,4, 6,5, 4,3); >> public class Rectangle < public Rectangle(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) < // проверка? >

2 ответа 2

public class Rectangle < public Rectangle(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) < boolean ok = false; // проверка // . if(!ok) throw new RectangleException(); >// для быстроты пусть будет статик public static class RectangleException extends Exception < // . >> 

Добавил main для наглядности:

public class Main < public static void main(String[] args) < // проверка Rectangle rect = null; try < rect = new Rectangle(1,2, 3,4, 6,5, 4,3); >catch(RectangleException ex) < // обработать исключение >// далее rect будет null если конструктор Rectangle не прошел проверку > > 

Конструктор не создаст объект если конструктор объекта кинет исключение. На то исключения и придумали. А переменную «ok» я выдумал для наглядности. Суть в выражении throw new RectangleException()

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

Читайте также:  How to change python version pycharm

Если все же нужно добавить какую-то логику для проверки используют шаблоны программирования (factory method, abstract factory, builder).

в вашем случае имеет смысл использовать factory method — добавляется статический метод который служит для создания этого обьекта и конструктор обьекта делается приватным (для того чтоб «умники» не создавали обьект в обход этого метода):

import java.text.MessageFormat; public class Rectangle < private static final String ERROR_MSG = "Points are on the same line, points : , , "; public static Rectangle valueOf(Point a, Point b, Point c, Point d) throws IllegalArgumentException < // create new rectangle Rectangle rectangle = new Rectangle(); rectangle.setA(a); rectangle.setB(b); rectangle.setC(c); rectangle.setD(d); rectangle.validate(); // throws an exception if rectangle is not valid one return rectangle; >private Point a; private Point b; private Point c; private Point d; private Rectangle() < >public Point getA() < return a; >public Point getB() < return b; >public Point getC() < return c; >public Point getD() < return d; >public void setA(Point a) < this.a = a; >public void setB(Point b) < this.b = b; >public void setC(Point c) < this.c = c; >public void setD(Point d) < this.d = d; >protected void validate() < validate(a, b, c); validate(a, b, d); validate(a, c, d); >/** * Check if 3 points are belong to the same line * * @param a1 * @param a2 * @param a3 */ protected void validate(Point a1, Point a2, Point a3) < // nothing to validate if (null == a1 || null == a2 || null == a3) < return; >// ensure the same point is not provided twice boolean valid = (a1 != a2 && a2 != a3 && a1 != a3); // ensure points are not placed on the line valid = valid && validateLine(a1, a2, a3); // throw error if needed if (false == valid) < throw new IllegalArgumentException(MessageFormat.format(ERROR_MSG, a1, a2, a3)); >> private boolean validateLine(Point a1, Point a2, Point a3) < // TODO: throw error if points are on the same line return false; >> 

класс Point который используется для хранения координат обычный POJO bean:

public class Point < private int x; private int y; public int getX() < return x; >public int getY() < return y; >public void setX(int x) < this.x = x; >public void setY(int y) < this.y = y; >> 

Источник

Читайте также:  Нужен ли python системному аналитику

Java создан ли объект

Привет всем читающим 🙂 value это приватное статичное поле класса String, ей присвоено значение объекта String. String text = «123»; String text2 = «456»; text.equals(text2); // «123» это value

Про реализацию метода equals в классе String: Для пояснений можно взять следующий код: (можно в IDE его скопировать, чтоб посмотреть вывод)

 String first = "привет"; String linkToFirst = first; String second = new String ("привет"); System.out.println(first.equals(linkToFirst)); System.out.println(first.equals(second)); 

Первый System.out.println выведет true. И дойдет проверка только до первого if. Мы вызываем у объекта «first«, типа String, метод equals, передавая в качестве параметра другую строку «linkToFirst«, которая, как мы видим, просто ссылается на тот же самый объект. Оператор «this» ссылается на объект, который вызвал этот метод. В нашем случае — это «first» вызвал метод «equals«, и в качестве передаваемого параметра отправил туда second. Когда мы написали в коде this, то подразумевали — «first«. Т.е. Это можно прочитать как:

 public boolean equals(Object anObject) < if (first == second)  

Так почему же мы попадем только в первый if? Потому что при использовании оператора == при сравнении объектов, сравниваются не сами объекты, а только ссылки на них. А у нас как раз такая история - мы ссылаемся на один и тот же объект, получаем return true, и вывод в консоль true.

 public boolean equals(Object anObject)

Второй System.out.println выведет также true, но проверка уже пойдет по всему методу, ибо первый if выдаст false. Ведь second не ссылается на first привет, а ссылается на новый объект

 if (anObject instanceof String) < //Проверяем, является ли строкой, // переданный в метод объект (second) String anotherString = (String) anObject; //если да, то приводим // переданный объект к типу String int n = value.length; // value - это массив символов*, объекта String, // который вызывает метод equals. // value.length - его длина. *- на самом деле это массив байтов, и каждый // символ может быть представлен в виде 1, 2, 3 или даже 4 байтами, // но сути это не меняет if (n == anotherString.value.length) < // сравниваем длину массива // символов текущего объекта, с переданным т.е. длину first и second) char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) < // далее мы в цикле уменьшаем количество // заходов в while и поочередно сравниваем между собой элементы (символы) // массивов исходного "first " и переданного // "second" (берется один и тот же индекс массива - "i"). // Как только они не совпадут - false и выход из цикла. // Если цикл завершился без преждевременного окончания, // значит объекты идентичны. if (v1[i] != v2[i]) return false; i++; > return true; > > return false; 

Источник

Java создан ли объект

Вопрос на собеседовании: Интервьюер: - "Кстати, а почему это вообще работает? Разве так можно делать?" Я: - "Можно. Ведь любой мейн-кун — это кошка. ". Джесси, спасибо! От души в душу.

сорян.. но тут кто-то повторял лекцию по памяти на всеобщее обозрение, а не писал что-то полезное.. конечно может быть это из-за разницы года написания 2018 и прочтения её в 2023 году.. ну тогда видимо надо убрать ссылку на это из основной лекции курса

В примере ниже оба instanceof истинны. Как такое произошло? У интерфейсов появились конструкторы? В java появилось множественное наследование? Интересно услышать мнение и объяснение автора статьи.

 public class InstanceOfMyExample < public static void main(String[] args) < Bird bird = new Bird(); System.out.println(bird instanceof Animal); // true System.out.println(bird instanceof Fly); // true >> interface Fly < >class Animal < >class Bird extends Animal implements Fly

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

JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.

Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.

Источник

Существует ли экземпляр класса?

Как определить, существует ли экземпляр класса?
Есть класс-окно(extends JFrame). Надо определить, создан ли его экземпляр или нет (что бы не создавать его больше одного раза).
Заранее спасибо.

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

Краш приложения при вызове метода из другого класса через экземпляр
Привет Хочу вызвать метод из другого класса. Для это создаю экземпляр этого класса через.

Создать экземпляр одного класса в Main, и передать его в экземпляр другого класса
Добрый день. Подскажите пожалуйста. есть несколько классов-файлов в одном пакете. class one.

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

Так и сделал: просто взял и объявил статическую переменную в классе. Но очень не хочется идти таким путем, объявляя кучу разных переменных.
Неужели нет способа определить создан ли экземпляр класса или нет. Не может быть. А нельзя ли для этого использовать хэш-таблицу? Я, правда, пока не очень понимаю как она работает и для чего нужна (вроде бы она содержит коды всех объектов). Может, можно как-нить перебирать все эти коды объектов, определяя экземпляром какого класса является объект с данным кодом?

Hashtable - это объект в котором можно хранить какой то любой Объект предварительно дав ему оригинальный ключ по которому потом в Hashtable ты можешь найти и выташить необходимый тебе объект.

Источник

Как проверить, есть ли (Object) в Java?

Но предложение if вызывает ошибку. Он ожидает boolean но Object задан. Java не может преобразовывать типы, не так ли?

Как мне изменить тип или что мне нужно включить в предложение if , чтобы он работал правильно?

Это коллекция (ArrayList) строк.

Object i = it.next(); // I get one element from collection. if (i) < // check if it not the end, if it not the last element of the collection 

Вы пытаетесь проверить, является ли оно нулевым?

Если вы проверяете логическое значение i а ArrayList – это List , тогда вы можете использовать Iterator it , но вам все равно нужно быть осторожным с исключениями из null-указателей.

Edit: Если вы хотите напечатать End когда все ненулевые строки удалены, вы можете удалить блок else и просто распечатать End после цикла for .

Luckly Iterator имеет функцию hasNext() .

Таким образом, вы будете использовать:

Object i = null; if(it.hasNext())< i = it.next(); >else < //done. >//Do stuff with i. 

Неясно, что вы хотите проверить.

Если вы хотите проверить, присутствует ли объект, проверьте значение null:

Если вы хотите проверить какое-либо свойство, то переведите его в определенный тип

if(((MyClass)i).iDontWantLoLive()) 

Если объекты имеют значение boolean, то для boolean:

Java – это строго типизированный язык. Если вы хотите/ожидаете логические значения, тогда сделайте что-то вроде этого…

 List list = new ArrayList(); for (Iterator it = list.iterator(); it.hasNext(); ) < boolean i = it.next(); if (i) < System.out.format("Delete %s%n", i); it.remove(); >else < System.out.println("End"); break; >> 

В противном случае, если вы просто пытаетесь удалить что-то на основании этого значения null, то (‘if (i == null)’, как предложили другие).

Ваш вывод “End” предполагает, что вы хотите сделать это в конце. Вы можете сделать это вместо этого.

List list = c.getArrayList(); for(Object o: list) System.out.println("Delete " + o); list.clear(); System.out.println("End"); 

Примечание: format просто возвращает строку, которую вы отбрасываете.

Это очень медленный способ удалить последний элемент списка. Вместо этого используйте

Да, Java не будет автоматически принуждать типы. Вам придется вручную перевести Object в Boolean .

Если вы просто хотите удалить последний элемент списка, вы можете сделать это:

Источник

Оцените статью