2013-07-12 34 views
5

Tôi đã refactoring một số mã để làm cho nó dễ dàng hơn để đọc và tôi chạy vào một cái gì đó mà tôi thấy lạ và tôi đã tự hỏi nếu có ai có thể giải thích điều này với tôi.Các biến trong các trường hợp chuyển đổi khác nhau không thể có cùng tên?

đang Original:

if(tokensLeft == 3) { 
    String id = tokens.nextToken(); 
    String value = tokens.nextToken(); 
    String trailerId = tokens.nextToken(); 
    rawListener.binaryInfo(id, Integer.parseInt(value), trailerId, this); 
} else if(tokensLeft == 2) { 
    String id = tokens.nextToken(); 
    String value = tokens.nextToken(); 
    rawListener.binaryInfo(id, Integer.parseInt(value), this); 
} else { 
    System.out.println("Method call binaryInfo could not be done because: \"Wrong number of parameters\""); 
} 

Sau refactoring:

switch(tokensLeft) { 
case 3: 
    String id = tokens.nextToken(); 
    String value = tokens.nextToken(); 
    String trailerId = tokens.nextToken(); 
    rawListener.binaryInfo(id, Integer.parseInt(value), trailerId, this); 
    break; 
case 2: 
    String id = tokens.nextToken(); // Syntax error 
    String value = tokens.nextToken(); // Syntax error 
    rawListener.binaryInfo(id, Integer.parseInt(value), this); 
    break; 
default: 
    System.out.println("Method call binaryInfo could not be done because: \"Wrong number of parameters\""); 
    break; 
} 

Thoạt nhìn này có vẻ hoàn toàn hợp lý, nhưng điều này mang lại cho tôi một lỗi cú pháp.

liên kết tất cả các tài liệu tham khảo cho một thay đổi tên địa phương (không thay đổi tài liệu tham khảo trong các tập tin khác)

Nó chỉ ra rằng đối với một số lý do trong một tuyên bố chuyển đổi, tôi không thể sử dụng String idString value lại trong một trường hợp khác.

Điều này làm cho việc đặt tên biến của tôi khá khó xử.

Bây giờ bạn có thể nói: "Chỉ cần khai báo các biến của bạn phía trên bảng sao kê chuyển đổi." Nhưng điều đó có nghĩa là tôi luôn luôn tạo biến của tôi, ngay cả khi tokensLeft không phải là 3 hoặc 2 và tôi sẽ không cần biến của tôi. Điều đó chỉ cảm thấy như sử dụng bộ nhớ không cần thiết.

Bất cứ ai có thể giải thích cho tôi lý do tại sao trường hợp chuyển đổi thực hiện việc này và cách tôi có thể giải quyết vấn đề của mình?

+2

Sử dụng phương pháp - đó là thực hành tốt anyway và phạm vi của bạn sẽ được sắp xếp cho bạn. Nếu bạn thực sự muốn viết mã spaghetti thì sử dụng các khối tường minh ('{}'). –

Trả lời

1

Làm thế nào để không khai báo các biến?

switch (tokensLeft) { 
    case 3: 
     rawListener.binaryInfo(
       tokens.nextToken(), 
       parseInt(tokens.nextToken()), 
       tokens.nextToken(), 
       this); 
     break; 
    case 2: 
     rawListener.binaryInfo(
       tokens.nextToken(), 
       parseInt(tokens.nextToken()), 
       this); 
     break; 
    default: 
     throw new IllegalArgumentException("Method call binaryInfo could not be done because: \"Wrong number of parameters\""); 
} 

Tôi đã thêm static nhập Integer.parseInt.

Hơn thế nữa gọi logic của bạn trong các phương pháp cũng được đặt tên từ switch và tuyên bố bất cứ điều gì bạn muốn biến:

public void parseTokens() { 
    switch (tokensLeft) { 
     case 3: 
      parseThreeTokens(rawListener, tokens); 
      break; 
     case 2: 
      parseTwoTokens(rawListener, tokens); 
      break; 
     default: 
      throw new IllegalArgumentException("Method call binaryInfo could not be done because: \"Wrong number of parameters\""); 
    } 
} 

public void parseThreeTokens(final RawListener rawListener, final Tokens tokens) { 
    final String id = tokens.nextToken(); 
    final String value = tokens.nextToken(); 
    final String trailerId = tokens.nextToken(); 
    rawListener.binaryInfo(id, parseInt(value), trailerId, this); 

} 

public void parseTwoTokens(final RawListener rawListener, final Tokens tokens) { 
    final String id = tokens.nextToken(); 
    final String value = tokens.nextToken(); 
    rawListener.binaryInfo(id, parseInt(value), this); 
} 
+2

Tôi đoán nó sẽ hoạt động, nhưng có vẻ như làm cho mọi việc ít dễ đọc hơn khi mục tiêu ban đầu của tôi là làm cho nó dễ dàng hơn. – JREN

+0

Trong trường hợp đó, tạo các phương thức. Mã của bạn không dễ đọc - thực hành tốt nhất (và chú Bob) gợi ý rằng các phương thức không nên dài quá 10 dòng. Khối chuyển đổi này đã gần 20. –

+0

Bạn có bất kỳ đề xuất nào về cách tôi có thể phân biệt giữa 2 phương pháp tôi muốn tạo vì sự khác biệt duy nhất là một trong số chúng sẽ sử dụng tham số thứ 3. Khác hơn thế, chúng giống hệt nhau. Và cả hai phương thức này sẽ chỉ chấp nhận 1 mã thông báo 'mã thông báo'. – JREN

3

Làm điều đó như sau

String id; 
    String value ; 

    switch(tokensLeft) { 
    case 3: 
    id = tokens.nextToken(); 
    value = tokens.nextToken(); 
    String trailerId = tokens.nextToken(); 
    rawListener.binaryInfo(id, Integer.parseInt(value), trailerId, this); 
    break; 
    case 2: 
    id = tokens.nextToken(); // Syntax error 
    value = tokens.nextToken(); // Syntax error 
    rawListener.binaryInfo(id, Integer.parseInt(value), this); 
    break; 
    default: 
    System.out.println("Method call binaryInfo could not be done because: \"Wrong number of parameters\""); 
    break; 
    } 

Ở đây nó sẽ không gây ra vấn đề bộ nhớ như bạn nói. Khi nó thực thi phương thức, nó sẽ giữ id và giá trị trong ngăn xếp và không có đối tượng liên quan nào trong đống cho các tham chiếu đó. Vì vậy, không có vấn đề với bộ nhớ thay vì bộ nhớ nhỏ nó mất cho hai ref.

+1

Vui lòng đọc những gì tôi đã nói bên dưới mã của tôi ... – JREN

8

Bạn đang xác định lại các biến, đó là khai báo biến trùng lặp. case không tạo khối.

Theo JLS 14:

Một khối là một chuỗi các báo cáo, tờ khai lớp địa phương và báo cáo khai báo biến cục bộ trong niềng răng.

Bạn có hai lựa chọn ở đây:

  1. Xác định một khối rõ ràng theo từng trường hợp sử dụng { .. }, mặc dù nó trông khá kỳ quặc tôi phải nói.

    HOẶC

  2. Trong mỗi case bạn có thể ủy logic để một lời gọi phương thức.

+0

Nhưng cách đó giúp tôi khắc phục sự cố của mình? – JREN

+3

Sau đó bạn có thể kèm theo logic trong một cuộc gọi phương thức cho từng trường hợp? – NINCOMPOOP

+0

Vâng, vâng, tôi thấy ngay bây giờ bạn đã chỉnh sửa câu trả lời của bạn: p – JREN

6

thêm {}. thử này:

switch(tokensLeft) { 
case 3: 
{ 
    String id = tokens.nextToken(); 
    String value = tokens.nextToken(); 
    String trailerId = tokens.nextToken(); 
    rawListener.binaryInfo(id, Integer.parseInt(value), trailerId, this); 
} 
    break; 
case 2: 
{ 
    String id = tokens.nextToken(); // Syntax error 
    String value = tokens.nextToken(); // Syntax error 
    rawListener.binaryInfo(id, Integer.parseInt(value), this); 
} 
    break; 
default: 
    System.out.println("Method call binaryInfo could not be done because: \"Wrong number of parameters\""); 
    break; 
} 
+0

khá thông minh. đây sẽ là câu trả lời đúng. nó đạt được mục tiêu của op để sử dụng cùng tên biến trong nhiều trường hợp chuyển đổi. – Thupten

2

Bạn có thể sử dụng dấu ngoặc nhọn {} sau khi trường hợp:

int aInt = 3; 
switch (aInt) { 
    case 0: { 
    String text = ""; 
    break; 
    } 
    case 1: { 
    String text = ""; 
    break; 
    } 
} 
0

case trong switch báo cáo không blocks; do đó, bằng cách khai báo cùng một biến trong nhiều trường hợp chuyển đổi, bạn đang cố gắng xác định lại biến. Điều này hoạt động trong các câu hỏi if vì chúng tạo thành blocks.

Hoặc khai báo trước khi chuyển đổi hoặc đặt các khối trong trường hợp của bạn.

Các vấn đề liên quan