package com.javarush.task.task23.task2309;
import com.javarush.task.task23.task2309.vo.*;
import java.util.List;
/*
Анонимность иногда так приятна!
*/
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
print(solution.getUsers());
print(solution.getLocations());
}
public static void print(List list) {
String format = "Id=%d, name='%s', description=%s";
for (Object obj : list) {
NamedItem item = (NamedItem) obj;
System.out.println(String.format(format, item.getId(), item.getName(), item.getDescription()));
}
}
public List<Location> getLocations() {
return new AbstractDbSelectExecutor<Location>() {
public String getQuery() {
return "SELECT * FROM LOCATION";
}
}.execute();
}
public List<User> getUsers() {
return new AbstractDbSelectExecutor<User>() {
public String getQuery() {
return "SELECT * FROM USER";
}
}.execute();
}
public List<Server> getServers() {
return new AbstractDbSelectExecutor<Server>() {
public String getQuery() {
return "SELECT * FROM SERVER";
}
}.execute();
}
public List<Subject> getSubjects() {
return new AbstractDbSelectExecutor<Subject>() {
public String getQuery() {
return "SELECT * FROM SUBJECT";
}
}.execute();
}
public List<Subscription> getSubscriptions() {
return new AbstractDbSelectExecutor<Subscription>() {
public String getQuery() {
return "SELECT * FROM SUBSCRIPTION";
}
}.execute();
}
}Максим
40 уровень
Все анонимные классы, которые создаются в get методах являются так же и локальными?
Обсуждается
Комментарии (11)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Стас ПасинковSoftware Developer в ZipyMaster
27 сентября 2018, 15:26
вы сможете сами ответить на ваш вопрос, когда скажете чем анонимные классы отличаются от обычных :)
потому что у локальные классы - это как обычные) только внутри методов))
0
Максим
27 сентября 2018, 15:36
Анонимные классы не имеют имени и конструкторов, но как мне это поможет не совсем понимаю. Объявить их можно в статических блоках, либо методах, получается, что если объявлен в методе, то он анонимный-локальный?
0
Стас ПасинковSoftware Developer в ZipyMaster
27 сентября 2018, 15:53
тогда такой вопрос: сколько ты можешь создать разных объектов одного анонимного класса? а локального?)
анонимные классы создаются "на лету". ты пишешь (недостающую) реализацию для объекта. но самого класса не создаешь. его создает за тебя джава.
в случае с локальным - ты же четко пишешь ключевое слово class, придумываешь ему имя, можешь создавать объекты этого класса когда захочешь и сколько захочешь (пока он находится в области видимости)
0
Максим
27 сентября 2018, 16:03
да, объект анонимного класса может быть только один, т.к. нет имени класса. Если внутри метода создать с класс именем, то он бдет внутренним-локальным. А если внутри метода создать анонимный класс, это ведь то же самое, только он анонимный-внутренний-локальный, разве нет?
0
Стас ПасинковSoftware Developer в ZipyMaster
27 сентября 2018, 17:26
не, он будет анонимным :)
если создаешь анонимный класс - то будет анонимный :)
если создаешь локальный - то будет локальный.
просто они - разные :)
анонимный класс - это просто так называют его классом)) ключевое слово class не используется для его создания. да и сам класс создает уже джава за тебя (в байткоде можно увидеть его просто как внутренний класс).
попробуй такой код:
и посмотри, как называется объект анонимного класса в выводе, а как - локального. в общем, это получается типичный внутренний класс после компиляции.
но если тебе хочется называть анонимный класс локальным - я не могу тебе запретить :)
0
Максим
27 сентября 2018, 17:41
но если тебе хочется называть анонимный класс локальным - я не могу тебе запретить :)
Я хочу понять как правильно:)
Вот вывод :
Одинаковый, за исключением того, что у анонимного имени нет
0
Максим
27 сентября 2018, 17:51
Из этой статьи, конкретно эта строка - Так как анонимный класс является локальным классом, он имеет все те же ограничения, что и локальный класс.
http://www.quizful.net/post/inner-classes-java
На основании анонимного класса создается поток и запускается с помощью метода start класса Thread. Синтаксис создания анонимного класса базируется на использовании оператора new с именем класса (интерфейса) и телом новосозданного анонимного класса.
Основное ограничение при использовании анонимных классов - это невозможность описания конструктора, так как класс не имеет имени. Аргументы, указанные в скобках, автоматически используются для вызова конструктора базового класса с теми же параметрами. Вот пример:
Так как анонимный класс является локальным классом, он имеет все те же ограничения, что и локальный класс.
Использование анонимных классов оправдано во многих случаях, в частности когда:
-тело класса является очень коротким;
-нужен только один экземпляр класса;
-класс используется в месте его создания или сразу после него;
-имя класса не важно и не облегчает понимание кода.
0
Антон Кашников
27 сентября 2018, 14:03
Локальными бывают переменные. Анонимный класс занимает место в памяти. Переменная имеет ссылку на это место в памяти. Класс вообще по природе своей не может быть локальным или нелокальным.
0
Максим
27 сентября 2018, 15:19
а это что?
0
Максим
27 сентября 2018, 15:22
или это что?
![]()
0
Антон Кашников
28 сентября 2018, 07:41
в данном примере ты создаешь не класс, а экземпляр класса.
Да, класс может быть "локальным" если его объявить (создать) в методе. Но оператор new создаёт экземпляр
0