Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 15.02.2018
Сообщений: 11

NPE и как с ним бороться, или то что делает код ужасным

25.12.2018, 13:36. Показов 1107. Ответов 10
Метки npe (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, форумчане!
Столкнулся с такой проблемой.
Сейчас я работаю с проектом связанным с телефонией, где приходиться активно работать с обьектами с огромным количеством параметром,которые в свою очередь связаны с базой данных, и являються сущностями Hibernate.
Проблема у меня следующего характера: есть очень много ситуаций, где при работе с этими обьектами я сталкиваюсь с NPE, и ситуаций таких чрезвычайно много. Сейчас в каждой такой ситуации мне приходиться либо делать проверку на нуль, либо же , где проверка не применима, заключать эти участки в try-catch блоки. Сразу же оговорюсь, ситуации в которых я могу получить нуль трудно предсказуемы т.к. зависят от того что вернёт сервер телефонии, что в свою очередь зависит от огромного количества факторов , которые учесть в некоторых ситуациях вообще не представляеться возможным. Так вот, все эти проверки и try-catch блоки делают код до безобразия отвратительным и совершенно нечитаемым, и это вообще не алё.

На данном этапе я вижу только 2 решения данной проблемы:
1) Это каждый раз при создании обьекта (а создаю я его много где) инициализировать его какими-то значениями по умолчанию.
Что мне не нравится: параметров реально огромное количество (20+ и я не могу их изменить т.к. такова специфика библиотеки которую я использую для телефонии) , а некоторые из них являються параметрами других обьектов которые тоже могут быть нуль. Получаються опять таки безобразные длинющие вызовы конструкторов, которые выглядеть не очень, дак + ещё нужно будет всем этим обьектам переприсваивать значения, что тоже кажеться лишней работой и как то не очень красиво;

2) Это создать метод, что то типа initObject() который будет, например, на вход принимать обьект любого типа , и там например создавать обьект этого типа с описанными в этом методе параметрами по умолчанию.
Что мне не нравится: этот вариант лучше , но я ещё не до конца уверен, что такое можно реализовать (никогда такого не делал. Не опытный я ещё) , можно ли запихнуть в такой метод несколько конструкторов одного типа обьекта и как потом всё это вызывать , и вообще нормально ли это?

Обращаюсь к Вам, уважаемые форумчане , что можно сделать в такой ситуации, в какую сторону двигаться , что почитать?
Спасибо большое!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.12.2018, 13:36
Ответы с готовыми решениями:

Что за егог и как с ним бороться?
<?php session_start(); $login=$_POST; $password=$_POST; echo "<html>\n"; echo "<meta http-equiv=\"Content-Language\"...

Вирус zivlingamer или оно же gameplayinfo и как с ним бороться
Сегодня при запуске системы вылез CMD, а после запустился браузер с сием чудом, после этого система запустилась как обычно и пока что...

Что делает PlaySound, и как с ним вообще работать
Господа подскажите что делает PlaySound , и как с ним вообще работать(там по идеи 3 параметра а вот какие) ?

10
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
25.12.2018, 13:48
Цитата Сообщение от GracefulLeo Посмотреть сообщение
где проверка не применима
можно пример такой ситуации?
Цитата Сообщение от GracefulLeo Посмотреть сообщение
что можно сделать
в любой непонятной ситуации можно прочитать про SOLID
1
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
25.12.2018, 15:27
Optional ?
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
25.12.2018, 18:31
Цитата Сообщение от GracefulLeo Посмотреть сообщение
Это каждый раз при создании обьекта
Покажи класс этого объекта и пример его создания.

Цитата Сообщение от GracefulLeo Посмотреть сообщение
а некоторые из них являються параметрами других обьектов которые тоже могут быть нуль
И этих других объектов.

И примеры их использования с этими проверками.
1
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
25.12.2018, 19:08
GracefulLeo, вопрос тут не как лучше написать код, а что будет делать твоя программа если она не получила нужного ей поля. Если поле не обязательно, нафига оно тогда тебе? А если обязательно, тогда это хорошо что программа отваливается если такого поля нет.

В общем случае можно создать свой класс с меньшим кол-вом полей которые реально нужны и маппить их (автоматически с использованием ModelMapper). На этих полях своего класса ты можешь проставить аннотации @NotNull и валидировать их опять же не плодя лишний код.
2
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
26.12.2018, 06:03
Цитата Сообщение от GracefulLeo Посмотреть сообщение
либо же , где проверка не применима
Интересные места... Это где такое может быть?
Цитата Сообщение от GracefulLeo Посмотреть сообщение
На данном этапе я вижу только 2 решения данной проблемы:
1) Это каждый раз при создании обьекта (а создаю я его много где) инициализировать его какими-то значениями по умолчанию.
Цитата Сообщение от GracefulLeo Посмотреть сообщение
2) Это создать метод, что то типа initObject() который будет, например, на вход принимать обьект любого типа , и там например создавать обьект этого типа с описанными в этом методе параметрами по умолчанию.
Не вижу ни в первом, ни во втором варианте адекватной логики. Если есть сущность, та же JPA или Hibernate, и в ней есть поля, которые могут быть NULL, они должны быть NULL, они не должны быть забиты чем то "по умолчанию", даже в каких то DAO "прослойках", это всегда лишняя логика, лишняя в плане лишней работы, лишнего кода и лишней нагрузки.

Цитата Сообщение от GracefulLeo Посмотреть сообщение
ситуации в которых я могу получить нуль трудно предсказуемы
Не нужно пытаться количественно или объемно характеризовать ситуации, когда поле может быть NULL, а когда нет. Здесь главное только два состояния - может быть NULL или не может быть NULL.
Если поле может быть NULL, значит нужно делать проверку, вот и всё. Для облегчения поиска таких "уязвимых мест" есть много способов, про них можно почитать в куче различных статей. Например аннотация javax.annotation.Nullable, поставленная на геттер, который может вернуть NULL, даст подсветку в многих IDE (NetBeans, Idea точно), где используется этот геттер и без проверок возможен NPE.

P.S. Если уж хочется избавиться от проверок, ну в геттере возвращай "значение по умолчанию", в случае, если поле NULL, аля:
Java
1
2
3
public SomeFieldType getSomeField() {
        return Objects.nonNull(this.someField) ? this.someField : что то по умолчанию;
}
Но это реально дичь...
1
0 / 0 / 0
Регистрация: 15.02.2018
Сообщений: 11
27.12.2018, 01:07  [ТС]
Цитата Сообщение от xoraxax Посмотреть сообщение
можно пример такой ситуации?
Код показать не получиться. Там реально надо скинуть метод и половину классов и долго объяснять. Если вкратце, Сама по себе данная программа многопоточная, и на фазе дозвона над одним и тем же обьектом шаманят 2 демона , и собственно поток отвечающий за дозвон. На данный момент всё так плохо в связи с тем, что нужно временное решение для прода , пока я же буду делать "нормальную" версию данной софтины и тестить её, и мне достаточно общих рекомендаций.

Цитата Сообщение от xoraxax Посмотреть сообщение
в любой непонятной ситуации можно прочитать про SOLID
Пытаюсь их "блюсти" , правда некоторые принципы в контексте данной софтины у меня реально хромают, нужно кое-что переделать, однако Вы натолкнули меня на правильный ход мыслей. Спасибо Вам =)

Цитата Сообщение от iSmokeJC Посмотреть сообщение
Optional ?
Я правильно понимаю, Вы об этом говорите?
https://docs.oracle.com/javase... ional.html

Цитата Сообщение от korvin_ Посмотреть сообщение
Покажи класс этого объекта и пример его создания.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
import javax.persistence.*;
 
@Entity
@Table(name = "sip_users")
public class SipUser {
    //=====================<<<MAIN PARAMETERS>>>================================
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private String id;
    @Column(name = "host")
    private String host;
    @Column(name = "nat")
    private String nat;
    @Column(name = "type")
    private String type;
    @Column(name = "context")
    private String context;
    @Column(name = "disallow")
    private String disallow;
    private String allow;
    @Column(name = "agent_id")
    private String agent_id;
 
    //=====================<<<MAIN PARAMETERS>>>================================
    private String callgroup;
 
 
    @Column(name = "cancallforward")
    private String cancallforward;
 
    @Column(name = "canreinvite")
    private String canreinvite;
 
    @Column(name = "dtmfmode")
    private String dtmfMode;
 
    @Column(name = "fromuser")
    private String fromUser;
 
    @Column(name = "fromdomain")
    private String fromDomain;
    private String insecure;
//    private String language;
 
    @Column(name = "mailbox")
    private String mailBox;
    //    private String md5secret;
    private String deny;
    private String permit;
    private String mask;
 
    @Column(name = "musiconhold")
    private String musicOnHold;
 
    @Column(name = "pickupgroup")
    private String pickUpGroup;
 
    private String qualify;
 
    @Column(name = "regexten")
    private String regExten;
 
//    @Column (name = "restrictcid")
//    private String restrictCID;
 
    @Column(name = "rtptimeout")
    private String rtpTimeOut;
 
    @Column(name = "rtpholdtimeout")
    private String rtpHoldTimeOut;
 
 
    @Column(name = "setvar")
    private String setVar;
 
    @Column(name = "ipaddr")
    private String ipAddr;
    private int port;
    private String regserver;
    private int regseconds;
    private int lastms;
    private String username;
    private String defaultuser;
    private String subscribecontext;
    private String useragent;
    private String fullcontact;
 
    //======================================= Credential entities ======================================================
    private String secret;
    private String name;
    private String callerid;
    //======================================= Credential entities ======================================================
 
 
    //========================================== WebRTC preset =========================================================
    private String encryption;
    private String avpf;
    private String force_avp;
    private String icesupport;
    private String directmedia;
    private String dtlsenable;
    private String dtlsverify;
    private String dtlscertfile;
    private String dtlscafile;
    private String dtlssetup;
    private String rtcp_mux;
    //========================================== WebRTC preset =========================================================
 
 
    public SipUser() {
    }
 
    public SipUser(String name, String context, String secret, String disallow, String allow) {
        this.name = name;
        this.context = context;
        this.secret = secret;
        this.disallow = disallow;
        this.allow = allow;
    }
 
    public SipUser(String name, String host, String type, String context, String secret, String disallow, String allow, String agent_id) {
        this.name = name;
        this.host = host;
        this.type = type;
        this.context = context;
        this.secret = secret;
        this.disallow = disallow;
        this.allow = allow;
        this.agent_id = agent_id;
    }
 
    public SipUser(String name, String context) {
        this.name = name;
        this.context = context;
    }
 
    public SipUser(String id, String name, String secret, String agent_id) {
        this.id = id;
        this.name = name;
        this.secret = secret;
        this.agent_id = agent_id;
    }
 
    public SipUser(String name, String secret, String agent_id) {
        this.name = name;
        this.secret = secret;
        this.agent_id = agent_id;
    }
 
    public SipUser(String name, String secret, String agent_id, String host, String nat, String type, String canCallForward,
                   String canreinvite, String context, String disallow, String allow, String encryption, String avpf,
                   String force_avp, String icesupport,String directmedia,String dtlsenable, String dtlsverify, String dtlscertfile,
                   String dtlscafile, String dtlssetup, String rtcp_mux) {
        this.name = name;
        this.secret = secret;
        this.agent_id = agent_id;
        this.host = host;
        this.nat = nat;
        this.type = type;
        this.cancallforward = canCallForward;
        this.canreinvite = canreinvite;
        this.context = context;
        this.disallow = disallow;
        this.allow = allow;
        this.encryption = encryption;
        this.avpf = avpf;
        this.force_avp = force_avp;
        this.icesupport = icesupport;
        this.directmedia =directmedia;
        this.dtlsenable = dtlsenable;
        this.dtlsverify = dtlsverify;
        this.dtlscertfile = dtlscertfile;
        this.dtlscafile = dtlscafile;
        this.dtlssetup = dtlssetup;
        this.rtcp_mux = rtcp_mux;
    }
 
    public SipUser(String name) {
        this.name = name;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getHost() {
        return host;
    }
 
    public void setHost(String host) {
        this.host = host;
    }
 
    public String getType() {
        return type;
    }
 
    public void setType(String type) {
        this.type = type;
    }
 
    public String getContext() {
        return context;
    }
 
    public void setContext(String context) {
        this.context = context;
    }
 
    public String getSecret() {
        return secret;
    }
 
    public void setSecret(String secret) {
        this.secret = secret;
    }
 
    public String getDisallow() {
        return disallow;
    }
 
    public void setDisallow(String disallow) {
        this.disallow = disallow;
    }
 
    public String getAllow() {
        return allow;
    }
 
    public void setAllow(String allow) {
        this.allow = allow;
    }
 
    public String getNat() {
        return nat;
    }
 
    public void setNat(String nat) {
        this.nat = nat;
    }
 
    public String getCallgroup() {
        return callgroup;
    }
 
    public void setCallgroup(String callgroup) {
        this.callgroup = callgroup;
    }
 
    public String getCallerid() {
        return callerid;
    }
 
    public void setCallerid(String callerid) {
        this.callerid = callerid;
    }
 
    public String getCanCallForward() {
        return cancallforward;
    }
 
    public void setCanCallForward(String canCallForward) {
        this.cancallforward = canCallForward;
    }
 
    public String getCanreinvite() {
        return canreinvite;
    }
 
    public void setCanreinvite(String canreinvite) {
        this.canreinvite = canreinvite;
    }
 
    public String getDtmfMode() {
        return dtmfMode;
    }
 
    public void setDtmfMode(String dtmfMode) {
        this.dtmfMode = dtmfMode;
    }
 
    public String getFromUser() {
        return fromUser;
    }
 
    public void setFromUser(String fromUser) {
        this.fromUser = fromUser;
    }
 
    public String getFromDomain() {
        return fromDomain;
    }
 
    public void setFromDomain(String fromDomain) {
        this.fromDomain = fromDomain;
    }
 
    public String getInsecure() {
        return insecure;
    }
 
    public void setInsecure(String insecure) {
        this.insecure = insecure;
    }
 
//    public String getLanguage() {
//        return language;
//    }
 
//    public void setLanguage(String language) {
//        this.language = language;
//    }
 
    public String getMailBox() {
        return mailBox;
    }
 
    public void setMailBox(String mailBox) {
        this.mailBox = mailBox;
    }
//
//    public String getMd5secret() {
//        return md5secret;
//    }
//
//    public void setMd5secret(String md5secret) {
//        this.md5secret = md5secret;
//    }
 
    public String getDeny() {
        return deny;
    }
 
    public void setDeny(String deny) {
        this.deny = deny;
    }
 
    public String getPermit() {
        return permit;
    }
 
    public void setPermit(String permit) {
        this.permit = permit;
    }
 
    public String getMask() {
        return mask;
    }
 
    public void setMask(String mask) {
        this.mask = mask;
    }
 
    public String getMusicOnHold() {
        return musicOnHold;
    }
 
    public void setMusicOnHold(String musicOnHold) {
        this.musicOnHold = musicOnHold;
    }
 
    public String getPickUpGroup() {
        return pickUpGroup;
    }
 
    public void setPickUpGroup(String pickUpGroup) {
        this.pickUpGroup = pickUpGroup;
    }
 
    public String getQualify() {
        return qualify;
    }
 
    public void setQualify(String qualify) {
        this.qualify = qualify;
    }
 
    public String getRegExten() {
        return regExten;
    }
 
    public void setRegExten(String regExten) {
        this.regExten = regExten;
    }
 
//    public String getRestrictCID() {
//        return restrictCID;
//    }
//
//    public void setRestrictCID(String restrictCID) {
//        this.restrictCID = restrictCID;
//    }
 
    public String getRtpTimeOut() {
        return rtpTimeOut;
    }
 
    public void setRtpTimeOut(String rtpTimeOut) {
        this.rtpTimeOut = rtpTimeOut;
    }
 
    public String getRtpHoldTimeOut() {
        return rtpHoldTimeOut;
    }
 
    public void setRtpHoldTimeOut(String rtpHoldTimeOut) {
        this.rtpHoldTimeOut = rtpHoldTimeOut;
    }
 
    public String getSetVar() {
        return setVar;
    }
 
    public void setSetVar(String setVar) {
        this.setVar = setVar;
    }
 
    public String getIpAddr() {
        return ipAddr;
    }
 
    public void setIpAddr(String ipAddr) {
        this.ipAddr = ipAddr;
    }
 
    public int getPort() {
        return port;
    }
 
    public void setPort(int port) {
        this.port = port;
    }
 
    public String getRegserver() {
        return regserver;
    }
 
    public void setRegserver(String regserver) {
        this.regserver = regserver;
    }
 
    public int getRegseconds() {
        return regseconds;
    }
 
    public void setRegseconds(int regseconds) {
        this.regseconds = regseconds;
    }
 
    public int getLastms() {
        return lastms;
    }
 
    public void setLastms(int lastms) {
        this.lastms = lastms;
    }
 
    public String getUsername() {
        return username;
    }
 
    public void setUsername(String username) {
        this.username = username;
    }
 
    public String getDefaultuser() {
        return defaultuser;
    }
 
    public void setDefaultuser(String defaultuser) {
        this.defaultuser = defaultuser;
    }
 
    public String getSubscribecontext() {
        return subscribecontext;
    }
 
    public void setSubscribecontext(String subscribecontext) {
        this.subscribecontext = subscribecontext;
    }
 
    public String getUseragent() {
        return useragent;
    }
 
    public void setUseragent(String useragent) {
        this.useragent = useragent;
    }
 
    public String getAgent_id() {
        return agent_id;
    }
 
    public void setAgent_id(String agent_id) {
        this.agent_id = agent_id;
    }
 
    public String getId() {
        return id;
    }
 
    public void setId(String id) {
        this.id = id;
    }
 
    public String getHOST() {
        return host;
    }
 
    public void setHOST(String HOST) {
        this.host = HOST;
    }
 
    public String getNAT() {
        return nat;
    }
 
    public void setNAT(String NAT) {
        this.nat = NAT;
    }
 
    public String getTYPE() {
        return type;
    }
 
    public void setTYPE(String TYPE) {
        this.type = TYPE;
    }
 
    public String getCONTEXT() {
        return context;
    }
 
    public void setCONTEXT(String CONTEXT) {
        this.context = CONTEXT;
    }
 
    public String getCanReinvite() {
        return canreinvite;
    }
 
    public String getENCRYPTION() {
        return encryption;
    }
 
    public void setENCRYPTION(String ENCRYPTION) {
        this.encryption = ENCRYPTION;
    }
 
    public String getAVPF() {
        return avpf;
    }
 
    public void setAVPF(String AVPF) {
        this.avpf = AVPF;
    }
 
    public String getFORCE_AVP() {
        return force_avp;
    }
 
    public void setFORCE_AVP(String FORCE_AVP) {
        this.force_avp = FORCE_AVP;
    }
 
    public String getICE_SUPPORT() {
        return icesupport;
    }
 
    public void setICE_SUPPORT(String ICE_SUPPORT) {
        this.icesupport = ICE_SUPPORT;
    }
 
    public String getDIRECT_MEDIA() {
        return directmedia;
    }
 
    public void setDIRECT_MEDIA(String DIRECT_MEDIA) {
        this.directmedia = DIRECT_MEDIA;
    }
 
    public String getDTLS_ENABLE() {
        return dtlsenable;
    }
 
    public void setDTLS_ENABLE(String DTLS_ENABLE) {
        this.dtlsenable = DTLS_ENABLE;
    }
 
    public String getDTLS_VERIFY() {
        return dtlsverify;
    }
 
    public void setDTLS_VERIFY(String DTLS_VERIFY) {
        this.dtlsverify = DTLS_VERIFY;
    }
 
    public String getDTLS_CERT_FILE() {
        return dtlscertfile;
    }
 
    public void setDTLS_CERT_FILE(String DTLS_CERT_FILE) {
        this.dtlscertfile = DTLS_CERT_FILE;
    }
 
    public String getDTLS_CA_FILE() {
        return dtlscafile;
    }
 
    public void setDTLS_CA_FILE(String DTLS_CA_FILE) {
        this.dtlscafile = DTLS_CA_FILE;
    }
 
    public String getDTLS_SETUP() {
        return dtlssetup;
    }
 
    public void setDTLS_SETUP(String DTLS_SETUP) {
        this.dtlssetup = DTLS_SETUP;
    }
 
    public String getRTCP_MUX() {
        return rtcp_mux;
    }
 
    public void setRTCP_MUX(String RTCP_MUX) {
        this.rtcp_mux = RTCP_MUX;
    }
 
    public String getFullcontact() {
        return fullcontact;
    }
 
    public void setFullcontact(String fullcontact) {
        this.fullcontact = fullcontact;
    }
}
Не знаю возможно ли его разбить на подклассы и промапить , как писали ниже, но я точно знаю, что таблица должна в точности соответствовать тем полям которые указаны в этом классе, иначе модуль отвечающий за работу с базой на сервере телефонии просто не поймёт эту сущность.

Цитата Сообщение от korvin_ Посмотреть сообщение
И этих других объектов.
И примеры их использования с этими проверками.
В частном случае это реально будет вырвано с контекста, и абсолютно непонятно, а если обьяснять с нуля то это будет долго и вряд ли кому-либо интересно. Меня интересуют больше общие рекомендации , нежели конкретно мой случай. В любом случае, спасибо Вам!

Цитата Сообщение от KEKCoGEN Посмотреть сообщение
GracefulLeo, вопрос тут не как лучше написать код, а что будет делать твоя программа если она не получила нужного ей поля. Если поле не обязательно, нафига оно тогда тебе? А если обязательно, тогда это хорошо что программа отваливается если такого поля нет.
В общем случае можно создать свой класс с меньшим кол-вом полей которые реально нужны и маппить их (автоматически с использованием ModelMapper). На этих полях своего класса ты можешь проставить аннотации @NotNull и валидировать их опять же не плодя лишний код.
На счёт ModelMapper обязательно загуглю. Спасибо Вам!

Цитата Сообщение от _ViPeR_ Посмотреть сообщение
Интересные места... Это где такое может быть?
Астериск (сервер телефонии) это вообще чудесный край, а многопоточная работа с ним одно удовольствие =)

Цитата Сообщение от _ViPeR_ Посмотреть сообщение
Не нужно пытаться количественно или объемно характеризовать ситуации, когда поле может быть NULL, а когда нет. Здесь главное только два состояния - может быть NULL или не может быть NULL.
Если поле может быть NULL, значит нужно делать проверку, вот и всё. Для облегчения поиска таких "уязвимых мест" есть много способов, про них можно почитать в куче различных статей. Например аннотация javax.annotation.Nullable, поставленная на геттер, который может вернуть NULL, даст подсветку в многих IDE (NetBeans, Idea точно), где используется этот геттер и без проверок возможен NPE.
В принципе как я себе и думал... Спасибо =)


Всем спасибо за комментарии, есть над чем помозговать и поработать)
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
27.12.2018, 02:02
Да, 22 параметра в конструкторе да и полей многовато))) Видимо изначально ни как не проектировалось, и получился не "объект класса" а "база данных класса/объекта", только данные без какой либо логики, сущность хранения и передачи данных дальше.
Я бы разбил класс на супер класс с заполнеными полями-таблицы(данные которые обязательно есть) и конструктором по умолчанию. И на подклассы такого содержания какие конструкторы у вас есть (можно даже 2-е, 3-е наследование), ну и ясное дело добавлял те поля, которые появляются в конструкторах. Ну и в конце в ваш самый "нижний" класс добавил все остальное. Плюсы : даже самый последний по иерархии будет лучше выглядить чем то что сейчас, + когда надо используется нужная сущность а не весь "паравоз".
2
0 / 0 / 0
Регистрация: 15.02.2018
Сообщений: 11
27.12.2018, 10:56  [ТС]
22 параметра в конструкторе да и полей многовато))) Видимо изначально ни как не проектировалось, и получился не "объект класса" а "база данных класса/объекта", только данные без какой либо логики, сущность хранения и передачи данных дальше.
Я бы разбил класс на супер класс с заполнеными полями-таблицы(данные которые обязательно есть) и конструктором по умолчанию. И на подклассы такого содержания какие конструкторы у вас есть (можно даже 2-е, 3-е наследование), ну и ясное дело добавлял те поля, которые появляются в конструкторах. Ну и в конце в ваш самый "нижний" класс добавил все остальное. Плюсы : даже самый последний по иерархии будет лучше выглядить чем то что сейчас, + когда надо используется нужная сущность а не весь "паравоз".
Дело не в проектировании. Насколько мне известно в hibernate одна таблица это одна сущность , соответственно один класс. Я не знаю можно ли разбить одну сущность на подсущности, но таблица обязана сохранять данный формат по-любому иначе не будет работать сервер телефонии. А можно ли разбивать сущность , на подсущности и как то их маппить всех с одной таблицей? (Не join и не связи типа manytoone, так оно работать не будет, проверено)
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
27.12.2018, 11:28
Цитата Сообщение от GracefulLeo Посмотреть сообщение
Насколько мне известно в hibernate одна таблица это одна сущность , соответственно один класс.
Это не так. https://memorynotfound.com/hib... n-example/

А вообще если это реальный проект, то судьба его будет печальна т.к на проекте должен быть хотя бы один человек уровнем выше джуниора чтобы направлять работу в нужное русло.
3
0 / 0 / 0
Регистрация: 15.02.2018
Сообщений: 11
27.12.2018, 13:07  [ТС]
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
За это спасибо, обязательно изучу.

Цитата Сообщение от KEKCoGEN Посмотреть сообщение
А вообще если это реальный проект, то судьба его будет печальна т.к на проекте должен быть хотя бы один человек уровнем выше джуниора чтобы направлять работу в нужное русло.
Это реальный проект, который в проде уже как 3 месяца. Сейчас дошли руки до рефакторинга, чтобы сделать его хотя бы более-менее читабельным.

Вообще над этим проектом работает один человек. На самом деле, да, целиком и полностью согласен по поводу направление работы в нужное русло, однако проект реально небольшой, и многого от него не требуется, и скорее всего после рефакторинга , я к нему уже возвращаться не буду. Единственное его назначение, это быть рабочим модулем телефонии, который справляеться с текущей и последующими(возрастающими) нагрузками на должном уровне не сильно заламывая при этом требования к серваку.

Предыдущей проект был написан С++ (его я кстати тоже поддерживаю, так как до сих пор некоторые наши офисы работают на старом сервере, и в связи с теме что они работают с очень важными клиентами, то никто не хочет там ничего менять, так как старые версии астериска, операционной системы (какая то древняя убунта) дак плюс к тому ещё и с тех пор как был написан тот проект вышел новый стандарт по с++ - 11-ый , и там вообще всё достаточно прискорбно). При этом моё приложение умудряеться работать быстрее и отказоустойчивее , в виду того что тот проект был написан в своё время таким же джуном (правда на плюсах) как я и архитектура там не намного лучше (если не сказать хуже). Больше заказчику от меня ничего не нужно =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.12.2018, 13:07
Помогаю со студенческими работами здесь

Плагиат. как с ним бороться?
тут просматриваю результаты поиска, вижу что мой текст скопировали..... один в один, даже часы работы (((( не проконсультируете ли...

Тег br и как с ним бороться
Этот вопрос может показаться глупым для умных людей, но все же. Чем отличается тег &lt;br&gt; от &lt;/br&gt;? Я понимаю что / это...

pagecontrol (и как с ним бороться)
Вопрос простенький просто не могу найти решения есть pagecontrol на нем 3 tabsheet (tabsheet1 tabsheet2 tabsheet3) есть три...

DBGrid, как с ним бороться?
У меня есть запрос, в нём поле 'ProductName', в нем есть одинаковые продукты. Мне нужно бы как-нибудь разделить продукты между собой,...

s.ytimg.com как с ним бороться?
См. скриншот, стало появляться недавно, вроде бы ничего не ставил, иногда удается убрать окошко кнопкой запретить, иногда браузер виснет. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru