-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathScala class
More file actions
executable file
·573 lines (430 loc) · 16.8 KB
/
Scala class
File metadata and controls
executable file
·573 lines (430 loc) · 16.8 KB
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
******* Scala Class **********
By default all the arguments passed to class are constructor arguments
All the free flowing code with the class body is constructor behavior.
In case if you want to create class level variables, you need to use val or var
Class methods can be defined with in the class body
scala> class Order(orderId: Int,orderDate: String,orderCustomerId: Int,orderStatus: String){
| println("I am inside order constructor")
| }
defined class Order
If we define the arguments in class itself,this mean we are creating a defaulty constructor with those arguments.
We can visualize this class as a java class by running below command
scala> :javap -p Order
Compiled from "<console>"
public class Order {
public Order(int, java.lang.String, int, java.lang.String);
}
## TO initalize a class or to create an object of the class Order, then,
scala> val order = new Order()
<console>:8: error: not enough arguments for constructor Order: (orderId: Int, orderDate: String, orderCustomerId: Int, orderStatus: String)Order.
Unspecified value parameters orderId, orderDate, orderCustomerId, ...
val order = new Order()
The above command as thrown error because we dont have default constructor with no args.BUt below will work
scala> val order = new Order(1,"2014-10-10",100,"COMPLETED")
I am inside order constructor
order: Order = Order@2e185cd7
Suppose we want to create functions,
then, ^
scala> class Order(orderId: Int,orderDate: String,orderCustomerId: Int,orderStatus: String){
| println("I am inside order constructor")
| override def toString = "Order ("+orderId+","+orderDate+","+orderStatus+")"
| }
defined class Order
scala> val order = new Order(1,"2014-10-10",100,"COMPLETED")
I am inside order constructor
order: Order = Order (1,2014-10-10,COMPLETED)
scala> :javap -p Order
Compiled from "<console>"
public class Order {
private final int orderId;
private final java.lang.String orderDate;
private final java.lang.String orderStatus;
public java.lang.String toString();
public Order(int, java.lang.String, int, java.lang.String);
}
#### suppose we want to access a variable say orderId,it is not possible because we dont not have getter and setter.To do that, we need to specify val for the constructor args during class creation.
scala> order.orderId
<console>:10: error: value orderId is not a member of Order
order.orderId
Now let us add val to the args
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Order(val orderId: Int,val orderDate: String,val orderCustomerId: Int,val orderStatus: String){
println("I am inside order constructor")
override def toString = "Order ("+orderId+","+orderDate+","+orderStatus+")"
}
// Exiting paste mode, now interpreting.
defined class Order
scala> :javap -p Order
Compiled from "<console>"
public class Order {
private final int orderId;
private final java.lang.String orderDate;
private final int orderCustomerId;
private final java.lang.String orderStatus;
public int orderId();
public java.lang.String orderDate();
public int orderCustomerId();
public java.lang.String orderStatus();
public java.lang.String toString();
public Order(int, java.lang.String, int, java.lang.String);
}
scala> order.orderId()
<console>:10: error: value orderId is not a member of Order
order.orderId()
Above commad did not work, bcoz scala doesnot accept () to invoke a method.Please refer below for more info
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Order(val orderId: Int,val orderDate: String,val orderCustomerId: Int,val orderStatus: String){
println("I am inside order constructor")
override def toString = "Order ("+orderId+","+orderDate+","+orderStatus+")"
}
// Exiting paste mode, now interpreting.
defined class Order
scala> val order = new Order(1,"2014-10-10",100,"COMPLETED")
I am inside order constructor
order: Order = Order (1,2014-10-10,COMPLETED)
scala> order.orderId
res0: Int = 1
scala> order.orderDate
res1: String = 2014-10-10
scala> order.orderDate()
<console>:10: error: not enough arguments for method apply: (index: Int)Char in class StringOps.
Unspecified value parameter index.
order.orderDate()
^
Now if we want to change the value of orderID, we cant do that becoz we have used val.We need to change it to var,Which will internally create setters
Val will only create getter
var will create both setter and getter
scala> order.orderId = 2;
<console>:9: error: reassignment to val
order.orderId = 2;
^
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Order(var orderId: Int,var orderDate: String,var orderCustomerId: Int,var orderStatus: String){
println("I am inside order constructor")
override def toString = "Order ("+orderId+","+orderDate+","+orderStatus+")"
}
// Exiting paste mode, now interpreting.
defined class Order
scala> val order = new Order(1,"2014-10-10",100,"COMPLETED")
I am inside order constructor
order: Order = Order (1,2014-10-10,COMPLETED)
scala> :javap -i order
usage :javap [opts] [path or class or -]...
-help Prints this help message
-raw Don't unmangle REPL names
-app Show the DelayedInit body of Apps
-fun Show anonfuns for class or Class#method
-verbose/-v Stack size, number of locals, method args
-private/-p Private classes and members
-package Package-private classes and members
-protected Protected classes and members
-public Public classes and members
-l Line and local variable tables
-c Disassembled code
-s Internal type signatures
-sysinfo System info of class
-constants Static final constants
scala> :javap -p order
Compiled from "<console>"
public class {
public static final MODULE$;
private final Order order;
public static {};
public Order order();
public ();
}
scala> :javap -p Order
Compiled from "<console>"
public class Order {
private int orderId;
private java.lang.String orderDate;
private int orderCustomerId;
private java.lang.String orderStatus;
public int orderId();
public void orderId_$eq(int);
public java.lang.String orderDate();
public void orderDate_$eq(java.lang.String);
public int orderCustomerId();
public void orderCustomerId_$eq(int);
public java.lang.String orderStatus();
public void orderStatus_$eq(java.lang.String);
public java.lang.String toString();
public Order(int, java.lang.String, int, java.lang.String);
}
scala> order.OrderId
<console>:10: error: value OrderId is not a member of Order
order.OrderId
^
scala> oerder.orderId
<console>:8: error: not found: value oerder
oerder.orderId
^
scala> order.orderId
res2: Int = 1
scala> order.orderId = 2
order.orderId: Int = 2
scala> order
res3: Order = Order (2,2014-10-10,COMPLETED)
scala> order.toString
res4: String = Order (2,2014-10-10,COMPLETED)
scala> order.orderId_=(3)
scala> order
res6: Order = Order (3,2014-10-10,COMPLETED)
scala> order.orderId=(4)
order.orderId: Int = 4
scala> order
res7: Order = Order (4,2014-10-10,COMPLETED)
scala> order.orderId=5
order.orderId: Int = 5
scala> order
res8: Order = Order (5,2014-10-10,COMPLETED)
*******Object
Objects are special types of classes.
It is singleton class
main function is defined in object
If the class name and object name are same then they are called as companions
We cannot instantiate object
******* there is no static method in scala *******
In Scala class, if you write a main method ,after compile,scala class will be converted to java class which in turns converts static main method to normal main method.
---------
Sample object,
scala> object HellowWorld {
| def main(args: Array[String]):Unit = {
| println("Hello world")
| }
| }
defined object HellowWorld
scala> HelloWorld.main(Array(""))
<console>:8: error: not found: value HelloWorld
HelloWorld.main(Array(""))
^
scala> HellowWorld.main(Array(""))
Hello world
----------
Companions
This mean both class and object have same name in single program.Let us see an example.
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Order(var orderId: Int,var orderDate: String,var orderCustomerId: Int,var orderStatus: String){
println("I am inside order constructor")
override def toString = "Order ("+orderId+","+orderDate+","+orderStatus+")"
}
object Order {
def apply(orderId:Int,orderDate:String,orderCustomerId:Int,orderStatus:String): Order = {
new Order(orderId,orderDate,orderCustomerId,orderStatus)
}
}
// Exiting paste mode, now interpreting.
defined class Order
defined object Order
scala> val order = Order.apply(1,"2014-01-01",123,"Completed")
I am inside order constructor
order: Order = Order (1,2014-01-01,Completed)
*** Note : Although we have a class and an object in same program,scala will create two different classes.
1.Order - represents class
2.Order$ - represents object
scala> :javap -p Order
Compiled from "<console>"
public class Order {
private int orderId;
private java.lang.String orderDate;
private int orderCustomerId;
private java.lang.String orderStatus;
public int orderId();
public void orderId_$eq(int);
public java.lang.String orderDate();
public void orderDate_$eq(java.lang.String);
public int orderCustomerId();
public void orderCustomerId_$eq(int);
public java.lang.String orderStatus();
public void orderStatus_$eq(java.lang.String);
public java.lang.String toString();
public Order(int, java.lang.String, int, java.lang.String);
}
scala> :javap -p Order$
Compiled from "<console>"
public class Order$ {
public static final Order$ MODULE$;
public static {};
public Order apply(int, java.lang.String, int, java.lang.String);
public Order$();
}
**** apply method name is optional while creating object
val order = Order.apply(1,"2014-01-01",123,"Completed")
or
val order = Order(1,"2014-01-01",123,"Completed")
we can have many apply methods with diff args
********
Case Class
Case class is special type of class, where we get boiler plate code
It contains companion object with apply method
Default constructor will be provided for case class
It implements Product and Serializable, which gives us functionality for methods such as productArity, productElement etc
By default, arguments passed to case class will be immutable variables (val). We will get getter methods for all the variables
If we define arguments as mutable variables (var), we will get functionality for both getter and setter methods.
There are few other methods for which boiler plate code is generated
toString
equals
hashCode
canEqual
apply
and more
case class Order(orderId: Int,orderDate: String,orderCustomerId: Int,orderStatus: String){
println("I am inside order constructor")
}
scala> case class Order(orderId: Int,orderDate: String,orderCustomerId: Int,orderStatus: String){
| println("I am inside order constructor")
| }
defined class Order
scala> :javap -p Order
Compiled from "<console>"
public class Order implements scala.Product,scala.Serializable {
private final int orderId;
private final java.lang.String orderDate;
private final int orderCustomerId;
private final java.lang.String orderStatus;
public int orderId();
public java.lang.String orderDate();
public int orderCustomerId();
public java.lang.String orderStatus();
public Order copy(int, java.lang.String, int, java.lang.String);
public int copy$default$1();
public java.lang.String copy$default$2();
public int copy$default$3();
public java.lang.String copy$default$4();
public java.lang.String productPrefix();
public int productArity();
public java.lang.Object productElement(int);
public scala.collection.Iterator<java.lang.Object> productIterator();
public boolean canEqual(java.lang.Object);
public int hashCode();
public java.lang.String toString();
public boolean equals(java.lang.Object);
public Order(int, java.lang.String, int, java.lang.String);
}
Even Order$ will be seen as below
scala> :javap -p Order$
Compiled from "<console>"
public class Order$ extends scala.runtime.AbstractFunction4<java.lang.Object, java.lang.String, java.lang.Object, java.lang.String, Order> implements scala.Serializable {
public static final Order$ MODULE$;
public static {};
public final java.lang.String toString();
public Order apply(int, java.lang.String, int, java.lang.String);
public scala.Option<scala.Tuple4<java.lang.Object, java.lang.String, java.lang.Object, java.lang.String>> unapply(Order);
private java.lang.Object readResolve();
public java.lang.Object apply(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object);
public Order$();
}
Now let us create var type args for case class
case class Order(var orderId: Int,var orderDate: String,var orderCustomerId: Int,var orderStatus: String){
println("I am inside order constructor")
}
scala> case class Order(var orderId: Int,var orderDate: String,var orderCustomerId: Int,var orderStatus: String){
| println("I am inside order constructor")
| }
defined class Order
scala> :javap -p Order
Compiled from "<console>"
public class Order implements scala.Product,scala.Serializable {
private int orderId;
private java.lang.String orderDate;
private int orderCustomerId;
private java.lang.String orderStatus;
public int orderId();
public void orderId_$eq(int);
public java.lang.String orderDate();
public void orderDate_$eq(java.lang.String);
public int orderCustomerId();
public void orderCustomerId_$eq(int);
public java.lang.String orderStatus();
public void orderStatus_$eq(java.lang.String);
public Order copy(int, java.lang.String, int, java.lang.String);
public int copy$default$1();
public java.lang.String copy$default$2();
public int copy$default$3();
public java.lang.String copy$default$4();
public java.lang.String productPrefix();
public int productArity();
public java.lang.Object productElement(int);
public scala.collection.Iterator<java.lang.Object> productIterator();
public boolean canEqual(java.lang.Object);
public int hashCode();
public java.lang.String toString();
public boolean equals(java.lang.Object);
public Order(int, java.lang.String, int, java.lang.String);
}
scala> :javap -p Order$
Compiled from "<console>"
public class Order$ extends scala.runtime.AbstractFunction4<java.lang.Object, java.lang.String, java.lang.Object, java.lang.String, Order> implements scala.Serializable {
public static final Order$ MODULE$;
public static {};
public final java.lang.String toString();
public Order apply(int, java.lang.String, int, java.lang.String);
public scala.Option<scala.Tuple4<java.lang.Object, java.lang.String, java.lang.Object, java.lang.String>> unapply(Order);
private java.lang.Object readResolve();
public java.lang.Object apply(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object);
public Order$();
}
We will now can see getter and setter method for var args
Now let us create an object
scala> val order = new Order(1,"2014-10-10",100,"COMPLETED")
I am inside order constructor
order: Order = Order(1,2014-10-10,100,COMPLETED)
scala> order.orderId
res4: Int = 1
scala> order.orderDate
res5: String = 2014-10-10
if you give order.<tab> you will get all supported methods
scala> order.
asInstanceOf copy orderCustomerId orderDate orderId orderStatus productArity productIterator toString
canEqual isInstanceOf orderCustomerId_= orderDate_= orderId_= orderStatus_= productElement productPrefix
if you give order.productElement<tab> it will give the args of that method.
scala> order.product
productArity productElement productIterator productPrefix
scala> order.productArity
def productArity: Int
scala> order.productArity
def productArity: Int
scala> order.productArity
def productArity: Int
scala> order.productArity
def productArity: Int
scala> order.productArity
res6: Int = 4
scala> order.productElement
def productElement(Int): Any
scala> order.productElement
def productElement(Int): Any
scala> order.productElement(1)
res7: Any = 2014-10-10
scala> order.productElement(0)
res8: Any = 1
scala> order.productElement(2)
scala> order.product
productArity productElement productIterator productPrefix
scala> order.productIterator
res10: Iterator[Any] = non-empty iterator
scala> order.productIterator.for
forall foreach
scala> order.productIterator.foreach(println(
| )
| ';
<console>:3: error: unclosed character literal
';
^
scala> order.productIterator.foreach(println)
1
2014-10-10
100
COMPLETED
scala> order.product
productArity productElement productIterator productPrefix
scala> order.productPrefix
def productPrefix: String
scala> order.productPrefix
def productPrefix: String
scala> order.productPrefix
res12: String = Order