Как передать объект в Java из класса B в класс C через класс A без дублирования
Допустим, у меня есть 3 класса.
- Класс А (расширяет активность)
Класс б
Класс C (расширяет вид)
A создает объект B, который содержит Bitmap
, А также делает недействительными С. С onDraw
рисует Bitmap
к его Canvas
,
Как мне нарисовать Bitmap
что B держит без создания другого Bitmap
объект в C? Обратите внимание, что для меня важно сохранить ту же "структуру классов".
Вот псевдокод. Вы можете видеть это ставит 2 Bitmap
объекты в памяти. Спасибо!
public class A extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
B b = new B();
C c = (C) findViewById(R.id.c);
c.passTheBitmap(b.bitmap);
c.postInvalidate();
}
}
public class B {
public Bitmap bitmap;
public B(){
bitmap = BitmapFactory.decodeResource(ActivityAContext.getResources(), R.drawable.fooBitmap);
}
}
public class C extends View {
public Bitmap bitmap;
public C(Context context, AttributeSet attrs) {
super(context, attrs);
}
public passTheBitmap(Bitmap b) {
bitmap = b;
}
@Override
public void onDraw(Canvas canvas) {
if (bitmap != null) {
canvas.drawBitmap(bitmap, 0, 0, null);
}
}
}
2 ответа
Я полагаю, вы думаете, что следующая строка:
c.passTheBitmap(b.bitmap);
Вызвало бы b.bitmap
чтобы получить копию. Это не так, пока b.bitmap
не примитив
В вашем коде единственный способ получить вторую копию, если вы используете new
намеренно создать новый объект.
Например в классе C
public passTheBitmap(Bitmap b) {
bitmap = new Bitmap(b);
}
Если вы делаете, как сделали:
public passTheBitmap(Bitmap b) {
bitmap = b;
}
... тогда Abbitmap и C.bitmap будут ссылаться на один и тот же объект в памяти.
Если это был C++, то у вас есть действительная проблема - но в Java то, что вы делаете, не делает копию передаваемого объекта.
НТН
Хорошо, имея объявленную в C переменную экземпляра, вы точно не дублируете объект Bitmap в C. У вас просто есть еще одна ссылка на исходный объект Bitmap, который создается в конструкторе B.