Changing a java object outside its class - java

Here's my question, how can I change an object outside of it's class, so that it maintains the changes made in the outside class?
Here's an example of the code:
Main class:
public class Main {
public static void main(String[] args)
{
Variable var = new Variable(1,2,3);
Change.changeVar(var);
System.out.println("" + var.geta() + "" + var.getb() + "" + var.getc());
}
}
Variable class:
public class Variable {
private int a;
private int b;
private int c;
public Variable(int a, int b, int c)
{
this.a = a;
this.b = b;
this.c = c;
}
public int geta()
{
return this.a;
}
public int getb()
{
return this.b;
}
public int getc()
{
return this.c;
}
}
Change class:
public class Change {
public static void changeVar(Variable var)
{
Variable var2 = new Variable(4,5,6);
var = var2;
}
}

In your example, no. When changeVar() exits, the parameter var is discarded, and the var in your main() method retains its original value. Read up on pass by reference.

public class Variable {
private int a;
private int b;
private int c;
public Variable(int a, int b, int c)
{
this.a = a;
this.b = b;
this.c = c;
}
public int geta()
{
return this.a;
}
public int getb()
{
return this.b;
}
public int getc()
{
return this.c;
}
// depending on your use case, setters might be more appropriate
// it depends on how you want to control the changing of the vars
public void update(int a, int b, int c) {
this.a = a;
this.b = b;
this.c = c;
}
}
public class Change {
public static void changeVar(Variable var)
{
var.update(4,5,6);
}
}

You cannot do it in a way that you described, because in Java variables are passed by values. However you can achieve the desired effect in a different way:
public class Variable {
private int a;
private int b;
private int c;
public Variable(int a, int b, int c)
{
this.a = a;
this.b = b;
this.c = c;
}
public int geta()
{
return this.a;
}
public int getb()
{
return this.b;
}
public int getc()
{
return this.c;
}
public void seta(int a) { this.a = a; }
public void setb(int b) { this.a = b; }
public void setc(int c) { this.a = c; }
}
public class Change {
public static void changeVar(Variable var)
{
var.seta(4);
var.setb(5);
var.setc(6);
}
}

You need to provide setter methods and call them on the original object:
public void seta(int newa) { this.a = newa; }
Then you would say
public static void changeVar(Variable var)
{
var.seta(4);
//etc
}
You are merely repointing the local variable reference var to point to your new instance var2. It has no effect on the value of the original instance passed into the method.

Doing it that way? You can't.
You're passing a reference to the instance. However, inside the function, you use a new reference. Assigning to the new reference does not affect others.

public static void changeVar(Variable var)
{
Variable var2 = new Variable(4,5,6);
var = var2;
}
first, u can write some setter methods in Variable class, then you can call these setter methods in the above code, like var.setA(4) ... and so on.enter code here

Related

Unable to map target properties using constructors with mapstruct

I am using MapStruct 1.5.2.Final
Map struct is unable to map the target values using the parameterised constructor. Following is the parameterised constructor for the class.
I know that if I would have exposed the setters, this would have worked.
I don't want to expose the setters for my class as I want my class to be immutable.
#JsonCreator
public PassengerInfo(
#JsonProperty("a") final String a,
#JsonProperty("b") final String b) {
this.a = a;
this.b = b;
}
I am getting the following error
error: Property "a" has no write accessor in class.
error: Property "b" has no write accessor in class.
Also, this is the only constructor in my class.
Following is my class
public class Clazz {
private final String a;
private final String b;
#JsonCreator
public Clazz(
#JsonProperty("a") final String a,
#JsonProperty("b") final String b) {
this.a = a;
this.b = b;
}
public String getA() {
return a;
}
public String getB() {
return b;
}
}
Your code seems fine. There must be something else in your project.
#Getter
#Setter
public class PassengerEntity {
private String a;
private String b;
}
public class PassengerInfo {
private final String a;
private final String b;
#JsonCreator
public PassengerInfo(
#JsonProperty("a") final String a,
#JsonProperty("b") final String b) {
this.a = a;
this.b = b;
}
public String getA() {
return a;
}
public String getB() {
return b;
}
}
#Mapper
public interface PassengerMapper {
PassengerInfo mapPassenger(PassengerEntity entity);
}
class PassengerMapperTest {
private PassengerMapper passengerMapper;
#BeforeEach
void setUp() {
passengerMapper = Mappers.getMapper(PassengerMapper.class);
}
#Test
void testMapper() {
PassengerEntity entity = new PassengerEntity();
entity.setA("valueA");
entity.setB("valueB");
PassengerInfo info = passengerMapper.mapPassenger(entity);
Assertions.assertEquals("valueA", info.getA());
Assertions.assertEquals("valueB", info.getB());
}
}
=> test is OK

No accessor method and mutator method

I was told by my lecturer that i have no accessor and mutator method in my class,but i have no idea what he means as i did include my accessor and mutator methods.
The 2 issue i can come up with are:
1.My mutator have to be for each individual variable instead of all the variable at once.
2.My sub-class needs accessor and mutator method for my super class variables.
I did ask my lecture but he said go figure it out yourself, and i didn't include the toString
abstract class TwoD implements Shape
{
//protected instance variables as the subclasses will use them
protected int a;
protected int b;
protected int c;
//default constructor
public TwoD() {}
//constructor for circle
public TwoD(int a)
{
this.a = a;
}
//constructor for rectangle
public TwoD(int a, int b)
{
this.a = a;
this.b = b;
}
//constructor for triangle
public TwoD(int a, int b, int c)
{
this.a = a;
this.b = b;
this.c = c;
}
//copy constructor
public TwoD(TwoD td)
{
this (td.a, td.b, td.c);
}
//accessor methods to get variables
public int getA()
{
return a;
}
public int getB()
{
return b;
}
public int getC()
{
return c;
}
//mutator methods to set variables
public void setA(int a)
{
this.a = a;
}
public void setAB(int a, int b)
{
this.a = a;
this.b = b;
}
public void setABC(int a, int b, int c)
{
this.a = a;
this.b = b;
this.c = c;
}
class Circle extends TwoD
{
//default constructor
public Circle() {}
public Circle(int radius)
{
super(radius);
}
//method to calculate area of circle
#Override
public double area()
{
return Math.PI * a * a;
}
//method to get calculated area
#Override
public double getArea()
{
return area();
}
Accessor methods are often called getters and mutator methods are often called setters.
A widely used pattern within the Java world is that you
make your fields (instance variables) private
private int a;
add a getter if you need an accessor method
public int getA() {
return this.a;
}
add a setter if you need a mutator method
public void setA(int a) {
this.a = a;
}
Accessor and mutator methods almost always change a single field.
Note that I, just like Aaron Davis, don't like this design either. Since subclasses are only able to add functionality, and are unable to remove or hide it, one must choose wisely which class extends the other. An example would be the well-known squares-rectangles problem.
You also need to use self-descriptive names. a, b and c should be renamed to something better describing what those variables represent.

multiple constructors for final fields in java

I have some final fields in the class like
class A {
private final boolean a;
private final boolean b;
public A(boolean a){
this.a = a;
}
public A(boolean a, boolean b){
this.a = a;
this.b = b;
}
}
But this gives an error that final field 'b' might not have been initialized.
So any help would be appreciated on how to handle final attributes initialization in case of multiple constructors. It works fine if I have only the second constructor.
You can initialize b to default false. All the final variable should be initialized in constructors.
public A(boolean a){
this.a = a;
this.b = false;
}
Or should call other constructors which would initialize them.
public A(boolean a){
this(a, false);
}
public A(boolean a, boolean b){
this.a = a;
this.b = b;
}
the problem is that first constructor does not initialize b, so java cannot assume any value, standard practice is to write code like this:
public A(boolean a){
this(a, DEFAULT VALUE FOR B);
}
public A(boolean a, boolean b){
this.a = a;
this.b = b;
}
this way you have only 1 real constructor, all other constructors are just short-cuts for it
you can call the constructor from another constructor too:
public class A{
private final boolean a;
private final boolean b;
public A(boolean a){
this(a,false);
}
public A(boolean a, boolean b){
this.a = a;
this.b = b;
}
}

Intellij - refactor getters and setters using delegate class

Here's what I'd like to do. Let's say I have this code:
public class Foo {
private Bar bar = new Bar();
public void doWork() {
bar.setA(5);
bar.setB(10);
}
}
public class Bar {
private int a;
private int b;
public void setA(int a) { this.a = a; }
public void setB(int b) { this.b = b; }
...
}
I want to extract members a and b from Bar into a separate Container class and end up with this code. Notice that Foo doesn't call setA on bar anymore, instead it requests container and calls a setter on it instead:
public class Foo {
private Bar bar = new Bar();
public void doWork() {
bar.getContainer.setA(5);
bar.getContainer.setB(10);
}
}
public class Bar {
private Container container;
public Container getContainer() { return container; }
...
}
public class Container {
private int a;
private int b;
public void setA(int a) { this.a = a; }
public void setB(int b) { this.b = b; }
...
}
Is there a way to do this in IntelliJ?
I could try using Refactor -> Extract -> Delegate, but in that case IntelliJ leaves setA and setB methods in Bar and doesn't change code in Foo:
public class Bar {
private Container container;
public void setA(int a) { container.setA(a); }
public void setB(int b) { container.setB(b); }
...
}
which is not quite what I want.
Select the piece of code inside class bar...
private int a;
private int b;
public void setA(int a) { this.a = a; }
public void setB(int b) { this.b = b; }
On the main menu, or from the context menu of the selection, choose Refactor | Extract | Method Object . You will also have option to choose to create inner class, or anonymous class. Hope this helps.

Find Java Error

Is there any error in the following Java code? I did not find one when I ran it.
public class WayToGo
{
private int aa, bb;
public void WayToGo(int a, int b)
{
aa = a;
bb = b;
}
}
If this is supposed to be a constructor :
public void WayToGo( int a,int b)
change it to :
public WayToGo( int a,int b)
A constructor has no return type. Not even void.
public class WayToGo {
private int aa, bb;
public WayToGo(int a, int b) {
***this.aa*** = a;
***this.bb*** = b;
}
}

Categories