java 기초 향상 편-대상 만들기

14996 단어 java 기초
나는 줄곧 구조기의 방식으로 대상을 생성하거나 초기화해 왔다.최근에 일부 대상이 프로젝트에서 실제 역할을 하지 않는 것을 발견했다. 때때로 나는 그것의 일부 기능만 필요로 한다. 이를 위해 새로운 대상을 만드는 것은 자원을 비교적 소모하고 프로그램의 성능에 영향을 주지 않는가.오늘 몇몇 자료를 보고 이 문제에 대해 대답을 했다.

설명:


우선 확실한 것은 우리가 때때로 하나의 클래스의 모든 기능을 필요로 하지 않는다는 것이다. 어쩌면 우리가 필요로 하는 것은 그 중의 한두 가지 방법일 수도 있고, 이를 위해 하나의 클래스를 새로 만들 필요가 없을 수도 있다.정태적인 방법이 이 문제를 해결했다.정적 방법은 모든 대상 설계 프로그램자에게 필수 과정이 되어야 한다.우선 우리는 정적 방법의 창설 대상을 배운다.
정적 공장을 사용하는 방식이 대상을 형성하는 장점은 다음과 같은 몇 가지가 있다. 첫째, 정적 방법은 모두 이름이 있기 때문에 당신이 무엇을 하고 있는지 더욱 잘 알 수 있다."2: 정적 방법을 사용하면 매번 대상을 만들 필요가 없고 메모리를 절약할 수 있다.""셋째: 더욱 유연하고 원래 되돌아오는 유형의 모든 하위 유형의 대상을 되돌릴 수 있다."넷째: 코드가 더욱 간결해 보인다."물론 그것도 단점이 있다. 그 중 하나는 정적 방법으로 대상을 만들면 공유나 보호된 구조기가 포함되지 않을 것 같다는 것이다. 그러면 자류가 계승하고 싶다면 불가능한 일이다.이것은 복합적으로 상속을 피함으로써 이 문제를 해결할 수 있다.
다음은 비교적 유명한 정적 구조기의 몇 가지 예를 소개할 것이다.

첫 번째 예: 다중 매개 변수 클래스


이 수요를 고려하면, 나는 종류를 하나 만들어야 한다.이 종류는 상품의 제품 설명을 묘사하는 데 쓰인다. 그러면 이 종류는 많은 파라미터가 있을 뿐만 아니라 대상마다 이 종류의 파라미터에 대한 수요가 다르다.만약 중첩 구조기를 사용한다면, 당신은 많은 구조기를 써야 하고, 최대 2의 n차 구조기를 필요로 한다.물론 나는 이렇게 쓰지 않을 것이다. 나는 자바빈스 모드를 사용하여 get, set 방식을 생성할 것이다.이런 방식은 결점이 있다. 솔직히 말해서 나는 아직 이렇게 쓴 위해를 볼 수 없다. 마치 다선정에서 안전하지 않은 것 같다.여기에는 보다 안전하고 완벽한 구조 방법을 추천합니다.
builder 모드를 사용하여 대상을 생성합니다.대략적인 생각은 다음과 같다. 이런 다중 매개 변수 클래스의 내부에builder의 내부 클래스를 구축하고 내부 클래스를 사용하여 전삼을 수신하고 마지막은 외부 클래스의 매개 변수를 업데이트하는 것이다.이렇게 하면 사전에 데이터의 합법성을 검측하고 비합법적인 데이터에 대해 사전에 처리하여 데이터의 안전성을 확보할 수 있다.여기에 예를 하나 제시한다(이런 종류를 작성하고 사용하려면 내부 클래스의 문법을 알아야 한다).
public class BuiltTest {
    private String name1, name2, name3, name4, name5, name6, name7;
    
    /*
     *  builder
     */
    public static class Built {
        private String name1, name2, name3, name4, name5, name6, name7;

        public Built setname1(String name1) {
            this.name1 = name1;
            return this;
        }

        public Built setname2(String name2) {
            this.name2 = name2;
            return this;
        }

        public Built setname3(String name3) {
            this.name3 = name3;
            return this;
        }

        public Built setname4(String name4) {
            this.name4 = name4;
            return this;
        }

        public Built setname5(String name5) {
            this.name5 = name5;
            return this;
        }

        public Built setname6(String name6) {
            this.name6 = name6;
            return this;
        }

        public Built setname7(String name7) {
            this.name7 = name7;
            return this;
        }

        public BuiltTest built() {
            return new BuiltTest(this);
        }
    }
    
    // 
    private BuiltTest(Built built) {
        this.name1 = built.name1;
        this.name2 = built.name2;
        this.name3 = built.name3;
        this.name4 = built.name4;
        this.name5 = built.name5;
        this.name6 = built.name6;
        this.name7 = built.name7;
    }
    
    // toSting 
    @Override
    public String toString() {
        String str="My name is "+name1+","+name2+","+name3+","+name4+","+name5+","+name6+","+name7;
        return str;
    }
}
 
호출된 코드:
// BuiltTest 
BuiltTest a=new BuiltTest.Built().setname1("xiaohua").setname2(" ").setname3(" ").built();
이러한builder 방법으로 만들어진 대상은 테스트를 통해 파라미터가 4보다 크면 성능이 더욱 우수하다.프로그램의 확장성을 고려하여 처음부터 builder 구조기를 사용하는 것이 좋습니다.

두 번째 예: Singleton 속성 강화


일부 프로그램에서 데이터 안전을 위해서 우리는 단지 하나의 대상만 필요로 하는데, 이때는singleton 모드가 필요하다.Singleton은 세 가지 쓰기 방법이 있는데 첫 번째는 Singleton의 상수를 정의하고 두 번째 방법은 공장의 방식으로 Singleton의 대상을 되돌려주며 세 번째 방법은 하나의 매거 유형의 대상을 되돌려주는 것이다.
// , final , 
public class Elvis {
    public static final Elvis INSTANC_ELVIS = new Elvis();

    private Elvis() {
    }
}
// , Singleton 

public class Elvis {
    private  static final Elvis INSTANC_ELVIS = new Elvis();

    private Elvis() {
    }
    
    public Elvis getElvis(){
        return INSTANC_ELVIS;
    }
}
// , enum  

public enum Elvis {
    INSTANC_ELVIS;
    
}
여기에 간단하게 매거류를 소개합니다. 매거 유형은java5입니다.0 이후 출시되었습니다.이런 수요를 고려하여 나는 하나의 종류를 설계하고 싶다. 그 대상은 셀 수 있는 것이고, 그 대상마다 유일하게 하고 싶다. 그리고 그 대상마다 변할 수 없는 것이 아니라고 생각한다.예를 들면 이런 종류는 바로 일요일 week입니다. 제가 어떻게 디자인해야 합니까?
static final 키워드를 사용할 수 있습니다.
package eum;

public class week1 {
    // 
    public static final week1 MONDAY = new week1(1);
    public static final week1 TUESDAY = new week1(2);
    public static final week1 WENTHDAY = new week1(3);
    
    private int i;
    private  week1(int i) {
        this.i=i;
    }
}
java1.5 이후 열거 유형을 사용할 수 있습니다.
public enum week2{
        // 
        MONDAY,TUESDAY,WENTHDAY;
    }
매거 유형의 실례는 처음 사용할 때 실례화된다.
매거 클래스는 특수한 클래스로, 우리가 컴파일할 때class 파일을 생성할 수 있다.자바에 계승.lang.Enum 클래스정의할 때 실례화된 대상 이름을 쓰고, 그 다음에 클래스의 정의 코드를 쓴다.데이터의 유일성을 확보하기 위해 매거는 계승될 수 없다.실례화할 때 Enum을 사용해야 합니다.valueOf () 방법으로 대상을 실례화합니다. 하나의 완전한 매거 유형의 예는 다음과 같습니다.
public class TestEnum {
    public enum TestE {
        MALE,FEMALE;
        public String name;
    }
    public static void main(String[] args) {
        TestE gg1=Enum.valueOf(TestE.class, "MALE");
        gg1.name=" ";
        System.out.println(" "+gg1+" "+gg1.name);
        
        TestE gg2=Enum.valueOf(TestE.class, "MALE");
        gg2.name=" ";
        System.out.println(" "+gg2+" "+gg2.name);
        
        
        System.out.println("gg1==gg2:"+(gg1.equals(gg2)));
        System.out.println("gg1.name==gg2.name:"+(gg1.name==gg2.name));
    }
}

 :
 MALE 
 MALE 
gg1==gg2:true
gg1.name==gg2.name:true
우리가 정의한 것보다 매거류는 좋은 점이 많다. 한마디로 선배들이 디자인한 것으로 모든 실례가 하나밖에 없다는 것을 확보했다.우리가 스스로 디자인한 첫 번째 종류는 결함이 있다. 예를 들어 서열화된 문제이다.
단일 모델에 대해 매거류의 디자인 보호류의 안전을 사용할 수 있다.

세 번째 예: 실례화되지 않은 유형에 대해 그 구조를 사유화한다.


하나의 프로젝트에서, 우리는 종종 가방 전문 보관 도구 종류를 세운다.예를 들어 자바EE 개발에서 우리는 데이터베이스를 조작해야 한다. 우리는 until 패키지를 만들어서 데이터베이스를 조작하는 도구를 저장한다. 이런 종류는 사용할 때 컴퓨터 자원을 많이 차지하는 실례화를 필요로 하지 않는다.이때 우리는 모든 방법과 구성원을 정적으로 정의하는 것을 선택했다.이때 유형의 구조 방법을 사유화하여 다른 사용자의 남용을 방지할 수 있다.

네 번째 예: 불필요한 창설 대상 피하기


여분의 대상을 만들 때 작업 시간을 낭비하고 for 순환에서 시스템의 시간을 백배로 낭비합니다.따라서 구조기 대신 정적 방법을 최대한 사용한다.String 상수에는
String s1=new String("String1");

String s1="String1";
가능한 한 다음 정의 방식을 사용하십시오. 전자는 두 개의 대상을 만들었고, 후자는 하나의 대상을 만들었으며, 문자열의 상수입니다.
자바는 자동으로 패키지를 설치하는 메커니즘을 제공합니다. 사용할 때 주의해야 할 것은, 때때로 우리는 무의식적으로 패키지를 사용하고 쓸모없는 클래스를 대량으로 만들었다는 것입니다.
Long s=0L;

for(int i=0;i<100;i++){
s+=i;
}
이 코드는 자동으로 패키지를 설치하기 때문에 실제적으로 쓸모가 없는 롱 실례를 많이 만들었다.

다섯 번째 예: 비교적 난해하고 쓰레기 회수, 자바가 원하지 않는 대상 제거


간단하게 말하면 이렇습니다. 자바 쓰레기 회수는 자동이고 매우 편리합니다.그러나 주의해야 할 점은 기한이 지난 앱의 경우 메모리 유출을 초래할 수 있다는 점이다.일의 원인은 한 대상이 인용만 있다면 쓰레기 수거기는 이 대상을 회수하지 않기 때문이다.우리가 직접 디자인한 무더기에서 먼저 성장하고 나중에 단축할 수 있다. 만약에 우리가 수동으로 성장하지 않고 성장한 것을 단축한다면 우리는 필요없다.'대상 인용'을 공백으로 설정하면 이런 대상들은 계속 존재할 것이다.성능에 영향을 줍니다.
우리가 스스로 메모리 관리를 설계할 때 인용 대상 수조에 관련될 때 이 문제를 주의해야 한다.
물론 집합은 이 문제를 잘 해결했다.

좋은 웹페이지 즐겨찾기