2013-07-29 1 views
2

는 상수 값은 내가 그것을 사용할 때마다 계산됩니다합니까? 여기에 예를 정적 공개 일정 액션 스크립트 3 개 모범 사례

:이

public static const RADIUS:Number = DIAMETER /2; 

처럼이 상수를 설정하면 결과는 내가이 상수를 사용할 때마다 계산됩니다 경우

public static const DIAMETER:Number = 100; 

그럼 나도 몰라.

정보가 필요합니다. 상수 객체 유형

같은 질문 :

public static const MY_POINT:Point = new Point(100,100); 

덕분에)

+0

두 개의 상수가 분리 된 파일 인 경우 첫 번째 경우를 사용하지 않는 것이 좋습니다. as3 사양에 대해 확신 할 수 없기 때문에 질문에 대답하지 않지만 C++에서 정적 대 실패 초기화 순서라고하는 것이 있습니다. 이 경우 어떤 정적 const 변수를 먼저 초기화할지 알 수있는 방법이 없습니다. 아마도 as3에는 그런 문제가 없을 것입니다. – krizajb

답변

1

const

상수는 상수이다. 그것은 일정하지 않기 때문에 변화하지 않는다는 것을 의미합니다. 상수 뒤에있는 아이디어는 런타임 중에 값이 변하지 않는다는 것을 확신 할 수 있다는 것입니다. 당신이 상수에 새로운 값을 할당하려고하면 다음과 같은 오류가 발생합니다 : 당신의 예에서

1049: Illegal assignment to a variable specified as constant.

, RADIUS는 다시 계산되지 않습니다. 사실, 변수에 액세스 할 때 그 동작은 발생하지 않습니다. 반환하기 전에 결과를 계산해야하는 게터를 통해 액세스하지 않는 한 이러한 동작은 발생하지 않습니다. 이 예는 두 점 사이의 거리를 반환하는 게터 일 수 있습니다.

마지막 예에서는 Point을 상수에 할당합니다. 이것은 예상했던 것보다 조금 다르게 행동합니다. 당신은 수 없습니다 할거야 포인트를 지정 MY_POINT 가리 킵니다. 일 수 있지만 그 점의 값은 수정됩니다. 예를 들어, 당신은이 작업을 수행 할 수있을 것입니다 :

MY_POINT.x = 10; 

상수가 기본 유형 (INT, UINT, 숫자, 부울, String)를 저장하기에 가장 적합하다. 이 경우 당신은 당신의 포인트의 xy를 저장하기 위해 별도의 상수를 만드는 것이 더 및 포인트의 작성을 생략 할 것이다 :

const POINT_X:int = 10; 
const POINT_Y:int = 15; 


static

static 수정 실제로 상수와 관련이 없으면 정의 된 속성이나 메서드를 해당 클래스의 인스턴스가 아닌 클래스 정의에 추가하는 별도의 키워드입니다. 상수는 상태 저장이며 변경되지 않으므로 클래스의 모든 인스턴스에 상수를 추가 할 이유가 없습니다.

상수는 프리미티브 데이터를 사용할 때 가독성과 보안을 추가하는 데 유용합니다. 이러한 상수는 관련 상수의 컬렉션으로 작동하는 클래스의 정적 멤버 또는 해당 상수를 해당 메서드의 인수로 사용하는 클래스로 저장할 수 있습니다.

Event 클래스는 좋은 예입니다. 프리미티브 데이터 (문자열)를 다양한 이벤트 유형을 나타내는 정적 상수로 저장합니다. Event.ACTIVATE. 이벤트 유형을 예상하는 메소드를 사용할 때 (예 : addEventListener(), 우리는 원시 "activate"보다는 그 상수를 참조 할 수 있습니다. 이것은 프리미티브가 맞춤법 오류를 허용하기 때문에 우리를 버그로부터 보호합니다. 오타를 상수에 액세스하면 컴파일 타임 오류가 발생합니다.

+0

"상수가 상태 유지되어 변경되지 않기 때문에 상수가 클래스의 모든 인스턴스에 첨부 될 이유가 없습니다": 대부분의 경우에 해당됩니다. 당신은 같은 값을 가진 모든 인스턴스의 상수 속성을 초기화 할 것이고, 쓸모없고 많은 자원이 낭비 될 것입니다.
하지만 클래스의 모든 인스턴스에 고유 ID를 추가하는 방법을 생각해보십시오. 다음과 같이 구현할 수 있습니다.'private static var lastId : uint = 0; public const id : uint = ++ lastId;'getter를 사용하지 않고 id를 읽기 전용으로 만들 수 있으며 최적화되고 간결합니다. – jauboux

3

'상수'(const)는 한 번만 설정할 수 있으며 개체 선언에 (일반적으로 즉시) 가까이 설정해야하는 개체입니다. 그래서 당신은이 작업을 수행 할 수 있습니다 : 당신이 이후에 설정할 수 있습니다 표시, 워드 프로세서

const val:String = 'hello world'; 

하지만이 될 것 같지 않습니다 : 대신

const val:String; 

... 5 minutes later ... 

val = 'hello world' 

을 수행해야 사전 정의 된 시간 또는 순서를 지정할 수 있습니다. 위에 설명한대로 즉시 설정하는 것이 가장 좋습니다. "엄격 모드"로 컴파일하는 경우 은 위와 마찬가지로으로 설정해야합니다.

상수는 처리 시간에 좋습니다. 고정 값이기 때문에 런타임은 훨씬 더 효율적인 방식으로이를 다르게 저장할 수 있습니다. 구체적으로 기억할 수는 없지만, const는 표준 변수에 비해 오브젝트 액세스 시간이 크게 향상되었습니다.

static은 액세스 수정 자이며, 마찬가지로 private 또는 public이 있습니다 (다른 몇 가지 정보가 있습니다. 모든 정보를 읽어 보시기 바랍니다). 정적 객체는 한 번만 존재합니다. 표준 객체는 클래스가 인스턴스화/액세스 될 때마다 선언됩니다. 정적 객체는 처음 선언 될 때만 나타납니다. 그래서에 저장된 public static var 간단한 클래스 다음

public class ClassA { 
    public static var URL:String = "http://google.com"; 
    public function ClassA(){ 
     //hello world 
    } 
} 

을 고려하십시오. 내가 그렇게으로 클래스를 인스턴스화 할 때 :

var hello:ClassA = new ClassA(); 

URL 만든 구글의 URL로 설정됩니다. 정적 속성은 객체에 속하지 않으므로 hello.URL에 액세스하려고하면 오류가 발생합니다. 대신 클래스 정의에 속합니다. 따라서 ClassA.URL으로 액세스하십시오. ClassA의 범위 내에서 ClassA.URL 또는 URL을 통해 액세스 할 수 있습니다. 일반적으로 정적 개체는 두 곳에서 사용됩니다.

  1. Util 클래스. Math.PI 또는 Math.max()이 좋은 예입니다.
  2. 단일 인스턴스를 저장해야하는 개체. 특정 시간에 한 명의 사용자로만 로그인 할 수있는 사용자 시스템에이 프로그램을 사용하고 싶습니다. 나는 일반적으로 User 개체를 가지고 있는데 여기에는 usernameaccountType 등이 저장되어 있습니다.

정적 개체는 좋고 나쁘다.수천 번 인스턴스화되고 값이 변경되지 않는 클래스의 경우, 이는 15 바이트 x 1000 또는 1.5 킬로바이트를 저장하는 대신 처음 15 바이트 만 저장하는 등 상당한 메모리 사용 이점을 제공합니다. 그러나 범위 문제와 일반적인 OOP 표준을 고려해야합니다. 당신은 그들이 정적 오브젝트와 Association Singletons (그것들은 정적 오브젝트와 같지 않습니다)에 의해 파란색이 될 때까지 주장 할 사람들을 찾을 것입니다. OOP 원리에 어긋나 기 때문에 절대 사용해서는 안됩니다. 사용자 객체에 정적 객체를 사용해야하는지 여부는 논란의 여지가 있습니다. 어떤 사람들은 Singleton (내 최신 프로젝트는 Singleton 대신에 실제로 사용됨)을 사용해야한다고 주장 할 것이고 어떤 사람들은 다른 방법을 사용해야한다고 주장 할 것이고 어떤 사람들은 객체를 통해 무한히 전달되어야하는 객체라고 주장 할 것이다. 그것은 절대적으로 악몽이다).

현실에서는 적합하다고 생각하는대로 사용하십시오. 당신은 개발자입니다. 프로젝트와 당신과 당신 팀에 가장 적합한 것이 무엇인지 알아보십시오.

는 (일반적으로 대부분의 클래스 기반 OOP 언어) AS3에서 액세스 한정자에 대한 좋은 일반적인 개요

static const 모두에서 혜택을 제공하기위한 상수에 대한 herehere을 읽어보십시오. 한 번만 존재하고 한 번만 설정되는 객체이므로 메모리 및 프로세스 시간 이점을 제공합니다. 일반적으로 변경되지 않지만 여러 번 액세스해야하는 값 (예 : Math.PI 또는 MouseEvent.MOUSE_DOWN)을 저장해야하는 경우에 사용됩니다.