2012-03-19 2 views
2

Например (с помощью android), если я хочу объявить константу класса Camera.Size, у меня нет очевидного способа сделать это. Я пробовал:Возможно ли иметь константы внутреннего класса? (Java)

private static final Camera.Size CAMERA_SIZE = Camera.new Camera.Size(640, 480); 

Очевидно, что это не работает, как вам нужно иметь экземпляр класса камеры, чтобы назвать «новым» с, например, так:

Camera mCamera = Camera.open(); 
Camera.Size size = mCamera.new Size(640, 480); 

Но я не могу» t сделать это до создания константы. Есть ли способ обойти это или это просто невозможно сделать?

+0

'private static final Camera.Size = Camera.new Camera.Size (640, 480);' отсутствует имя поля между типом и '='. –

+0

Вот где я потерялся. Вы хотите установить другой Camera.Size для каждого нового экземпляра камеры или пытаетесь установить размер для всех объектов камеры? – AndrewKS

+0

Я просто хочу константу размера, чтобы при необходимости я мог перейти к параметрам камеры, а не записывать сами значения. Например: params.setPictureSize (CONSTANT.width, CONSTANT.height), а не params.setPictureSize (640, 480) – sler

ответ

1

вы не можете этого сделать.

Размер - нестатический внутренний класс камеры. вы можете создавать только размер внутри класса камеры; вы не можете создать новый Camera.Size.

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.3_r1/android/hardware/Camera.java#Camera.Size

на этой основе, я бы сказал, что API для этого написано неправильно. конструктор должен быть закрытым, или pkg private, чтобы было ясно, что вы не можете создать экземпляр этого класса.

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

+0

Мне не требуется технически, я хочу создать размер по умолчанию, сделанный камерой. Думаю, лучшим вариантом было бы иметь 2 отдельных константы для ширины и высоты. – sler

2
Camera mCamera = Camera.open(); 
private final Camera.Size size = mCamera.new Size(640, 480); 
+0

Это действительно не помогает, я хочу создать константу в области действия класса, чтобы я не мог вызовите функцию Camera.open() перед созданием константы – sler

1
public class Camera 
{ 
     public static final Camera.Size DEFAULT_SIZE = new Camera.Size(640, 480); 
} 

вы можете получить доступ к постоянной, как: Camera.DEFAULT_SIZE

+0

Я думаю, вы предполагаете, что я сам написал класс (я этого не сделал). Извините, я, вероятно, должен был сделать это более понятным в описании :) – sler

1

Я думаю, что вам нужно сделать, это:

private static final Camera.Size SIZE; 
static { 
    Camera mCamera = Camera.open(); 
    SIZE = mCamera.new Camera.Size(640, 480); 
} 

или ...

private static final Camera.Size SIZE = 
    (Camera.open()).new Camera.Size(640, 480); 

Howeve r, все это кажется немного неудобным. Объект, связанный с SIZE, будет привязан к экземпляру Camera, который не доступен иным образом.

Я подозреваю, что Camera.Size действительно должен быть классом static ... так, как вы используете его здесь.

public class Camera { 
    public static class Size { ... } 
    ... 
    public static final Size SIZE = new Size(...); 
    ... 
} 
Смежные вопросы