Какова наилучшая практика для java, позволяющей перезвонить классу?

Вот проблема:

Я получил класс под названием MyClass, который является обычным классом, имеет переменную i, а MyOtherClass будет иметь некоторую логику внутри, чтобы изменить значение MyClass i, но я не хочу передавать значение i в MyOtherClass, я бы хотел, чтобы они вызов addOne и метод minusOne. Как я могу изменить MyOtherClass чтобы сделать это? Я могу изменить конструктор MyOtherClass для выполнения этого требования. Благодарю.

public class MyClass{

 int i;

 public void myMethod(){

 //I would like to myOtherClass a, b can call back MyClass addOne, and minusOne
 MyOtherClass a = new MyOtherClass(); 
 MyOtherClass b = new MyOtherClass();

 a.runLogic(); 
 b.runLogin(); 
 }

 public void addOne(){
 i++; 
 }

 public void minusOne(){
 i--; 
 } 

 pubic void printI(){
 System.out.print(i);
 }
}

Код, который использует MyClass

MyClass myClass = new MyClass(); 

myClass.myMethod(); 

myClass.printI();
4 ответа

Передайте ссылку на MyClass в MyOtherClass и вызовите нужные вам методы.

Если вы ищете более общее решение, сделайте MyClass реализованым интерфейс и примите экземпляр этого интерфейса в MyOtherClass. Это обеспечило бы большую гибкость.

//here your interface.
public interface IMyClass{
 void addOne();
 void minusOne();
}

//implement interface in MyClass.
public class MyClass implements IMyClass{/*...*/}

public class MyOtherClass{
 IMyClass myClass;
 public MyOtherClass(IMyClass myClass){
 this.myClass = myClass;
 }

 public void test(){
 myClass.addOne();
 myClass.minusOne();
 }
}

Это подходит для более сложных типов, чем это. Здесь это немного глупо, потому что класс делает так мало, но, возможно, ваш пример упрощен для чего-то более сложного. Просто совет.


Просто передайте this как аргумент другому конструктору класса или методу runLogic:

public class MyClass {
 private int i;

 pulic void addOne() {
 i++;
 }

 public void myMethod() {
 MyOtherClass c = new MyOtherClass(this);
 c.runLogic();
 } 
}

public class MyOtherClass {
 private MyClass myClass;

 public MyOtherClass(MyClass myClass) {
 this.myClass = myClass;
 }

 public void runLogic() {
 myClass.addOne();
 }
}


Передайте объект MyClass в конструктор MyOtherClass, например

Class MyOtherClass 
{
MyClass mc;

// constructor
MyOtherClass (MyClass mc)
{
this.mc = mc;
}

void testMethod(){
 mc.i = 10; // or whatever you want to assign
}

}


вам просто нужно передать текущий объект MyClass в My OtherClass. Вы можете это сделать

MyOtherClass a = new MyOtherClass(this); 
MyOtherClass b = new MyOtherClass(this);

Теперь внутри вашего MyOtherClass вам нужно изменить свой конструктор

public MyOtherClass(MyClass myClass) {
 this.myClass = myClass;
 }

Теперь вы можете вызвать любой метод myClass из MyOtherClass

licensed under cc by-sa 3.0 with attribution.