Я новичок в Java. Я видел код ниже из учебника Java Oracle. Я изо всех сил, чтобы понять цель этого фрагмента кода:Почему метод getRGB() написан так, как он сделал? Есть ли альтернативный способ написать метод getRGB()?
public synchronized int getRGB() {
return ((red << 16) | (green << 8) | blue);
}
Я понимаю, как побитовое работы оператора, но я изо всех сил, чтобы понять, почему метод getRGB() записывается так, как это сделал. Есть ли альтернативный способ написать метод getRGB()?
public class SynchronizedRGB {
// Values must be between 0 and 255.
private int red;
private int green;
private int blue;
private String name;
private void check(int red,
int green,
int blue) {
if (red < 0 || red > 255
|| green < 0 || green > 255
|| blue < 0 || blue > 255) {
throw new IllegalArgumentException();
}
}
public SynchronizedRGB(int red,
int green,
int blue,
String name) {
check(red, green, blue);
this.red = red;
this.green = green;
this.blue = blue;
this.name = name;
}
public void set(int red,
int green,
int blue,
String name) {
check(red, green, blue);
synchronized (this) {
this.red = red;
this.green = green;
this.blue = blue;
this.name = name;
}
}
public synchronized int getRGB() {
return ((red << 16) | (green << 8) | blue);
}
public synchronized String getName() {
return name;
}
public synchronized void invert() {
red = 255 - red;
green = 255 - green;
blue = 255 - blue;
name = "Inverse of " + name;
}
public static void main(String[] args) {
SynchronizedRGB color = new SynchronizedRGB(0, 0, 0, "Pitch black");
System.out.println(color.getRGB());
}
}
8 бит - это все, что вам нужно представлять от 0 до 255. Я подозреваю, что это было написано таким образом, чтобы предотвратить чрезмерное использование памяти (каждый цвет с использованием полного 32-битного int, когда им нужно только 8) и/или тактовых циклов (три вызовы функций против одного). Вы можете, конечно, переопределить метод, если хотите. – Taelsin
Это упакованный 'int', как правило, значения RGB (A) представлены в большинстве графических окружностей. Вы могли бы написать его, чтобы вернуть массив 'int', но что означает каждый элемент? Вы можете создать класс «RGB», который просто содержит геттеры для каждого значения, но он не такой переносимый, как упакованный 'int' is – MadProgrammer